Сегодня мой друг и я много боролись за глупую ошибку, и я удивляюсь тому, как работают параметры шаблона в 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++
х?
Да, 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 может быть применено, если вы хотите:
«Знание того, какие имена являются именами типов, позволяет проверять синтаксис каждого шаблона. Программа некорректна, диагностика не требуется, если:
- для шаблона не может быть сформирована действительная специализация, и этот шаблон не был создан, или … «
Не существует легального способа инициировать создание экземпляра этого шаблона, поэтому вы можете утверждать, что для него не может быть сгенерировано действительной специализации. Согласно этой интерпретации, поведение не определено, и все, что разрешено делать.
Других решений пока нет …