2012-11-06 4 views
2

어떤 표준에 따라 잘 형성된 경우 : 3 및 4의 경우에템플릿 매개 변수 순서가 공제 되었습니까? 다음에

// 1 : Deduced template parameter in the normal order 
template<typename T, typename T1 = typename std::conditional<std::is_fundamental<T>::value, T, int>::type> 
void f(T x); 

// 2 : Deduced template parameter in the inverted order 
template<typename T1 = typename std::conditional<std::is_fundamental<T>::value, T, int>::type, typename T> 
void f(T x); 

// 3 : Deduced template parameter before a function pointer 
template<typename T> 
void f(T x, void(*g)(int, int, T*)); 

// 4 : Deduced template parameter after a function pointer 
template<typename T> 
void f(void(*g)(int, int, T*), T x); 

// 5 : Deduced template parameter with inversed variables 
template<typename T, typename T1 = typename std::conditional<std::is_fundamental<T>::value, T, int>::type> 
void f(T1 x, T y); 

// 6 : Inverted deduced parameter 
template<typename T, typename T1> 
void f(T1 x, T y); 

변수로부터 함수 내 전달 타입 선택이 끝난 될 형, 다른 경우 : 함수 중 하나 또는 변수 중 하나? 이 선언되기 전에 의 기본 템플릿 인수에 T이 사용 되었기 때문에

+0

"ok"를 정의하십시오. 잘 정의 된 _and_ 잘 정의되지 않은 _ 아닌 _ 아닌가? –

+0

'변수와 함수 내부에서 전달 된 타입이 다른 경우'그들은 그렇지 않습니다. 이제까지. 그렇게하려고하면 잘못된 인수가 전달되어 컴파일이 실패합니다. –

+0

특성 뒤에':: value'가 없습니다. – jrok

답변

5

(2)이 잘못되었습니다. 나머지는 잘 형성되어 있습니다.

(3)과 (4)에서 T을 함수 인수에서 추론해야하는 경우 T은 사용되는 각 위치에서 동일한 유형으로 추론해야합니다. 즉, 첫 번째 함수 매개 변수에서 사용 된 것으로부터 하나의 유형으로 추론되고 두 번째 함수 매개 변수에서 사용 된 것과 다른 유형으로 추론되면 공제는 실패하고 사용은 부적절합니다.

(5)에서 T1의 기본 인수는 사용되지 않습니다. 실제 인수는 특수화가 사용될 때 지정되거나 템플릿 인수는 함수 인수 x에서 추론됩니다.

(6)에는 특별한 것이 없습니다. 모든 템플릿 인수가 함수 인수에서 추론되는 경우 템플릿 인수가 선언 된 순서는 부적합합니다.

+0

에서 (4) - (3)에서도 마찬가지이다. – ecatmur

+0

나는 값 문제를 수정하고 6 번째 사례를 추가했다. – Vincent

관련 문제