Играя с C++ 17 аргументами шаблона auto
, я столкнулся с другим несогласием g++/клана g++.
Учитывая следующий простой код
template <auto>
struct foo;
template <int I>
struct foo<I>
{ };
int main ()
{
foo<42l> f42; // <--- long constant, not int constant
(void)f42; // avoid the "unused variable" warning
}
Я вижу, что клан g++ (8.0.0, к примеру) компилирует код, где g++ (9.2.0, к примеру) выдает следующую ошибку
prog.cc: In function 'int main()':
prog.cc:12:13: error: aggregate 'foo<42> f42' has incomplete type and cannot be defined
12 | foo<42l> f42;
| ^~~
Оба компилятора компилируются, если мы используем константу int
вместо константы long
foo<42> f42; // compile with both clang++ and g++
Итак, у меня есть два вопроса для языковых слоев C++
(1) законно ли, в C++ 17, специализировать шаблон, объявленный получающим параметр шаблона auto
, для значения определенного типа (как специализация foo
в моем коде)?
(2) если ответ на предыдущий вопрос "да", специализация шаблона может перехватывать значение другого (но конвертируемого) типа?
Вопрос (2) почти такой: правый клан g++ или g++?