Сопоставление параметров шаблона шаблона с аргументами по умолчанию
Этот вопрос связан с этим и должен быть с конкретными случаями ниже
template<class T, class U = T> class B { };
template <class ... Types> class C { };
template<template<class> class P> class X { };
X<B>{ }; // OK
X<C>{ }; // OK
Стандарт в [temp.arg.template]/3
пометил эти два случая как ОК, но последнее обновление дефекта CWG 150 говорит, что CWG
решил пока не предпринимать действий. ни clang
ни gcc
принять код
Являются clang
а также gcc
не-совместимый?
1 ответ
GCC принимает это с 7.1. clang намеренно не принимает его, если вы не укажете новый флаг:
Несмотря на то, что это разрешение для отчета о дефектах, эта функция отключена по умолчанию во всех языковых версиях и может быть включена явно с флагом
-frelaxed-template-template-args
в Clang 4 года. Изменению в стандарте не хватает соответствующего изменения для частичного упорядочения шаблона, что приводит к ошибкам неоднозначности для разумного и ранее действительного кода. Эта проблема, как ожидается, будет исправлена в ближайшее время.
Примеры указанного взломанного кода смотрите в этом вопросе.
Также последнее обновление по основной проблеме, о которой идет речь, заключается в том, что это было:
[Перемещено в DR на совещании в ноябре 2016 года в качестве документа P0522R0.]
Это только вверху вопроса, а не внизу. Я добавил ссылку.