2017-11-09 8 views
2

는 예를 생각해클래스 템플릿 인수의 공제와 관련된 함수 스타일 캐스트 표현식을 자유롭게 사용할 수 있습니까?

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

int main() { 
       tag(int{});  //#1 
    auto t1 = tag(int{});  //#2 
    auto t3 = (tag(int{})); //#3 
} 

tag는 클래스 템플릿 인수의 공제에 참여해야 자동 공제 가이드가 있습니다. 적어도 # 1과 # 3은 예기치 않게 조금 행동해야한다고 생각했습니다. [clang]. 반면에 모든 것은 [gcc]에서 잘 컴파일됩니다. 그래서 질문은 함수 스타일 - 캐스트 표현식에서 클래스 템플릿 인수의 공제를 자유롭게 사용할 수 있습니까? 아니면 문제에 대한 제한이 있습니까?

그 소리의 오류 목록 :

prog.cc:7:19: error: expected unqualified-id 
       tag(int{});  //#1 
       ^
prog.cc:7:19: error: expected ')' 
prog.cc:7:18: note: to match this '(' 
       tag(int{});  //#1 
       ^
prog.cc:9:23: error: expected ')' 
    auto t3 = (tag(int{})); //#3 
        ^
prog.cc:9:19: note: to match this '(' 
    auto t3 = (tag(int{})); //#3 
       ^
prog.cc:9:27: error: expected expression 
    auto t3 = (tag(int{})); //#3 
         ^
4 errors generated. 
+1

'연산자 +'는 # 1과 # 4에 중점을 두어 다음 질문과 관련이 없습니다. MVCE를 ' 구조 태그 {tag (T) {}}; 템플릿'으로 최소화 할 수 있습니다. W.r. # 1과 # 3, 나는 clang이 그것을 받아들이지 않는다는 것이 이상하고 (인수 목록을 포함 할 때 그것을 받아들이 기 때문에) 동의하며, 태그의 ctors의 자동 공제 가이드가 적용되는 방법과 관련이 있어야한다. . – dfri

+0

@dfri 최소화, 좋은 지적, 감사합니다! –

답변

1

이, #34091 알려진 버그입니다. 기본적으로 clang은 템플릿 ID 인을 얻을 것으로 기대하지 않습니다. 결국 고정 될 것입니다 (하지만 5.0.1에서는 두렵습니다).

질문에 대답하려면 예, gcc가 완전합니다. 두 가지 간단한 경우 클래스 템플릿 인수 공제가 작동하지 않는다면 나는 표준위원회에서 정말로 화를 낼 것입니다. : P

+1

적어도 버그 보고서를 제출하지 않아도됩니다;) –