Параметр шаблона C ++ и частичная специализация: строгая или слабая типизация?

Сегодня мой друг и я много боролись за глупую ошибку, и я удивляюсь тому, как работают параметры шаблона в C ++. Рассмотрим следующий код, где я пытаюсь частично специализировать класс attr<MyClass<I>> где I является unsigned int, хоть MyClass ожидает int параметр:

#include <iostream>

template<int I>
class MyClass
{

};

template<typename T>
struct attr;

template<unsigned int I>
struct attr<MyClass<I>>
{

};

int main(int argc, char *argv[])
{
attr<MyClass<1>> att;
return 0;
}

g++ не удается с сообщением об ошибке

main.cpp: In function ‘int main(int, char**)’:
main.cpp:20:22: erreur : aggregate ‘attr<MyClass<1> > att’ has incomplete type and cannot be defined
attr<MyClass<1>> att;

А также clang компилирует его (только предупреждение из-за того, что att не используется).

Так что мне было интересно:

  • есть ли в спецификации что-то, что будет править в пользу одного или другого?

  • Можем ли мы сказать, что clang типизация параметра шаблона слабее, чем g++х?

5

Решение

Да, GCC правильно отклонить, по крайней мере, в соответствии с действующими стандартами. Возможно, ребята из Clang реализуют здесь отчет о дефектах, я бы не знал.

http://eel.is/c++draft/temp.deduct.type#17

Если P имеет форму, которая содержит <i>и если тип соответствующего значения A отличается от типа i, вывод не выполняется. Если P имеет форму, которая содержит [i]и, если тип i не является целочисленным, вывод не выполняется.

Их тестовый набор в тестовом наборе тестирует это только для функций, для которых они, по-видимому, генерируют разумные сообщения об ошибках: https://github.com/llvm-mirror/clang/blob/master/test/CXX/temp/temp.fct.spec/temp.deduct/temp.deduct.type/p17.cpp.

Кроме того, поскольку частичная специализация никогда не может быть выведена, мы также сталкиваемся с http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#549 , который спрашивает, должны ли такие конструкции быть отклонены заранее. По моему мнению, http://eel.is/c++draft/temp.res#8 может быть применено, если вы хотите:

«Знание того, какие имена являются именами типов, позволяет проверять синтаксис каждого шаблона. Программа некорректна, диагностика не требуется, если:

  • для шаблона не может быть сформирована действительная специализация, и этот шаблон не был создан, или … «

Не существует легального способа инициировать создание экземпляра этого шаблона, поэтому вы можете утверждать, что для него не может быть сгенерировано действительной специализации. Согласно этой интерпретации, поведение не определено, и все, что разрешено делать.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]