Требуется ли диагностика для неиспользуемых шаблонов элементов с плохо сформированными параметрами шаблона по умолчанию?
Рассмотрим следующий шаблон класса:
template<typename T>
struct S
{
template<auto = T()>
void f();
};
Это плохо сформировано для создания экземпляра S
с параметрами шаблона T
, для которого auto = T()
плохо сформировано?
int main()
{
S<int> a; // ok
S<int&> b; // error
S<int()> c; // gcc ok, clang error
}
Кажется, это так, но проблема в том c
, где S
создается экземпляр с типом функции. gcc с этим согласен, а clang говорит:
error: cannot create object of function type 'int ()'
что имеет смысл. Поскольку gcc действительно диагностирует создание экземпляра int&
, я подозреваю, что это ошибка gcc. Это верно, или для этого кода диагностика не требуется ?
Ответы
Это CWG1635 :
1635. Насколько похожи аргументы шаблона по умолчанию на аргументы функции по умолчанию?
Аргументы функции по умолчанию создаются только при необходимости. Верно ли то же самое в отношении аргументов шаблона по умолчанию? Например, правильно ли сформировано следующее?
#include <type_traits> template<class T> struct X { template<class U = typename T::type> static void foo(int){} static void foo(...){} }; int main(){ X<std::enable_if<false>>::foo(0); }
Кроме того, такой же эффект при поиске? Например,
struct S { template<typename T = U> void f(); struct U {}; };