デフォルトのテンプレートパラメータが正しく形成されていない未使用のメンバーテンプレートには診断が必要ですか?

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 {};
 };