2017-10-06 13 views
8

는 예를 고려 안내 보장 :는 그 템플릿 템플릿 매개 변수 호출 사용자가 제공 공제

#include <type_traits> 
#include <string> 

template <template <class> class TT> //#1 
struct Foo { 
    static void foo() { 
     static_assert(std::is_same_v<decltype(TT("abc")), TT<std::string>>); 
    } 
}; 

template <class T> 
struct Bar { 
    Bar(T) {} 
}; 

template <class T> 
Bar(T) -> Bar<std::string>; //#2 

int main() { 
    Foo<Bar>::foo(); 
} 

[clang]뿐만 아니라 [gcc] 모두 사용자가 제공 공제 가이드를 사용하는 것을 (# 2) 템플릿의 템플릿 매개 변수를 추론 할 때 템플릿 매개 변수 (# 1). 표준 준수 기능입니까?

답변

4

예, 표준 규격입니다. [dcl.type.simple]/2에 따르면

:

유형 지정 양식 typename 옵트의중첩 된 이름 지정 선택 하템플릿 이름이 추정되는 클래스 형식에 대한 자리 표시 자입니다 ([dcl.type.class.deduct]). 템플릿 이름은 삽입 된 클래스 이름이 아닌 클래스 템플릿의 이름을 지정해야합니다.

그리고 [temp.param]/3 :

누구의 식별자 줄임표를 따르지 않는 (template없이 선언 된 경우) 형식 정의 이름 또는 템플릿 이름으로 식별자를 정의 형식 매개 변수 (template으로 선언 된 경우)은 템플릿 선언의 범위에 있습니다.

TT

는 그것을 템플릿 이름 및 추정되는 클래스 유형에 따라서 자리 표시합니다 template로 선언 된 형식 매개 변수입니다. 모든 일반적인 규칙이 적용됩니다.

+0

사실 내가 그 대답을 기대했는데, 잘못 되었다면 ... 그럼 다시 받아 들일 것입니다.) –

+0

: 약간의 질문으로 자동 공제 가이드가 적용되어서는 안되는가? –

+0

@ W.F. 좋아, 나는 완전히 대답을 뒤집 었어. – Barry