Сопоставление параметров шаблона шаблона с аргументами по умолчанию

Этот вопрос связан с этим и должен быть с конкретными случаями ниже

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.]

Это только вверху вопроса, а не внизу. Я добавил ссылку.

Другие вопросы по тегам