잘못된 형식의 기본 템플릿 매개 변수가있는 사용하지 않는 멤버 템플릿에 대해 진단이 필요합니까?
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 {}; };