잘못된 형식의 기본 템플릿 매개 변수가있는 사용하지 않는 멤버 템플릿에 대해 진단이 필요합니까?

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