이것은 resolution이 초안 C++ 17 표준에 최근에 투표 된 CWG1395입니다. 다음은 [temp.deduct.partial]에 첨가 하였다 :
... 함수 템플릿 F
는 적어도 함수 서식 G
반대로 같은 전문되고, [] 만약 G
후행 파라미터 팩이 있으면 어떤 경우에는 F
에 해당 매개 변수가없고 F
에 후행 매개 변수 팩이없는 경우 F
은 G
보다 더 전문화되어 있습니다.
표준은 "후행 매개 변수 팩"이 의미하는 것을 명시 적으로 정의하지는 않지만이 용어가 사용되는 기존 문맥에서 판단 할 때 가장 오른쪽 매개 변수로 나타나는 템플릿 매개 변수 팩을 참조합니다. 템플릿 매개 변수 목록 :
template<class T, class... U> struct X;
// ^^^^^^^^^^
또는 함수 매개 변수 목록의 맨 오른쪽 매개 변수로 표시되는 함수 매개 변수 팩 :
이
template<class T, class... U> void y(T, U...);
// ^^^^
현재 초안은 여전히이 포함되어 있습니다 [temp.deduct.type]에서 오래된 예 :
template<class T, class... U> void f(T, U...);
template<class T> void f(T);
f(&i); // error: ambiguous
이 표준 결함 보고서는 몇 년 동안 주변되었습니다, 그리고 GCC 및 Clang 모두 그것의 해상도를 구현했습니다. 그들은 위의 예가 f
의 두 번째 오버로드의 유효한 호출이라는 것에 모두 동의합니다.
여기서 GCC와 Clang은 결함 해결의 범위에 속합니다. 이는 제안 된 표준 문구를 포함하도록 최근에 업데이트 된 것이므로 이해할 수 있습니다. 당신의 예에서 팩은 함수 매개 변수 목록으로 확장 된 것이 아니라, 함수 매개 변수 형식의 템플릿 인수 목록에 : g
의 두 번째 오버로드의 유효한 전화로
template<class T, class... U> void g(tuple<T, U...>);
template<class T> void g(tuple<T>);
g(tuple<int>{});
GCC 취급이; Clang은이를 모호한 것으로 취급합니다.Clang의 정확성은 후행 템플릿 매개 변수 팩을 포함 할 것인지, 아니면 함수 매개 변수 팩의 후행만을 포함 할 것인지에 따라 달라질 수 있습니다. 두 컴파일러가 C<int>
다음 예제 클래스 템플릿 C
의 두 번째 부분 특수화를 참조하는 동의
는
참고 :
template<class...> struct C;
template<class T, class... U> struct C<T, U...> {};
template<class T> struct C<T> {};
이 연타의 모순처럼 보인다 인해 일부 주문에 대한 표준 규칙 클래스 템플릿 전문은 함수 템플릿의 부분 순서에 따라 정의됩니다. CWG1432을 참조하십시오.
롤,이 두 가지 의견은 서로 모순입니다! 그래서 여기서 논의 할 것이 있습니다. – Walter
@ Jarod42 그래서 '후행 매개 변수 팩'은 템플릿 매개 변수가 아닌 함수 인수를 나타냅니다. – Walter
실제로 clang과 gcc는 동의하지 않습니다 [데모] (http://coliru.stacked-crooked.com/a/6f67a0a696424a56). – Jarod42