는 예를 생각해클래스 템플릿 인수의 공제와 관련된 함수 스타일 캐스트 표현식을 자유롭게 사용할 수 있습니까?
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과 # 4에 중점을 두어 다음 질문과 관련이 없습니다. MVCE를 ' 구조 태그 {tag (T) {}}; 템플릿'으로 최소화 할 수 있습니다. W.r. # 1과 # 3, 나는 clang이 그것을 받아들이지 않는다는 것이 이상하고 (인수 목록을 포함 할 때 그것을 받아들이 기 때문에) 동의하며, 태그의 ctors의 자동 공제 가이드가 적용되는 방법과 관련이 있어야한다. . –
dfri
@dfri 최소화, 좋은 지적, 감사합니다! –