Требуется ли диагностика для неиспользуемых шаблонов элементов с плохо сформированными параметрами шаблона по умолчанию?

Aug 19 2020

Рассмотрим следующий шаблон класса:

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. Это верно, или для этого кода диагностика не требуется ?

Ответы

1 LanguageLawyer Aug 19 2020 at 14:10

Это 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 {};
 };