2013-08-16 4 views
15

나는 다음과 같은 두 가지 오버로드를 고려하는 경우 :범용 참조 대 const 참조 우선 순위?

template <class... T> void f(const T&... x); 
template <class T> void f(const T& x); 

내가 f(x) 항상 두 번째 함수를 호출하고 모호함으로 이어질하지 않을 것이라는 보장이있다. 어떤면에서 두 번째 버전은 유형이 무엇이든 하나의 인수에 대해 첫 번째 버전과 비교하여 보편적으로 우선 순위가 매겨집니다. 이 두 기능 사이에 보편적 우선 순위에 관계없이 x의 유형 (자신이다 :

template <class T> void f(T&& x); 
template <class T> void f(const T& x); 

내 질문은 :

지금 보편적 참조 및 함수의 const를 참조 버전이 상황을 고려 r 값 참조, 참조, cv 한정자, 포인터 ...) 앞의 경우와 비슷합니까? (그렇다면 우선 순위는 무엇입니까?)

+2

나는 이것을 포함하는 [this talk] (http://www.youtube.com/watch?v=T5swP3dr190)라고 생각한다. – chris

답변

17

이 두 기능 간에는 우선 순위가 없습니다. 그들은 과부하 해결 알고리즘에서도 똑같이 경쟁합니다. 일반적으로 const T&이 정확히 일치하지 않으면 이른바 "universal reference"가 우승하며 거기에는 const T&이 우승합니다.

struct A {}; 

int 
main() 
{ 
    f(std::declval<A>()); // calls f<A>(A&&), #1 
    f(std::declval<const A>()); // calls f<const A>(const A&&), #1 
    f(std::declval<A&>()); // calls f<A&>(A&), #1 
    f(std::declval<A&&>()); // calls f<A>(A&&), #1 
    f(std::declval<const A&&>()); // calls f<const A>(const A&&), #1 
    f(std::declval<const A&>()); // calls f<A>(const A&), #2 
} 

좋은 조언이 같은 결코 과부하이다.

+0

# 2가 처음으로 후보로 등장하지는 않았 으면 어떤 경우에 언급 할 가치가 있습니다. –

+0

@BenVoigt 무언가를 놓치지 않는 한 두 오버로드가이 모든 표현식에서 실행 가능합니다. – aschepler

+0

@aschepler : 당신이 옳다고 생각합니다. 어쩌면 놀랄만 한 'T &&'대'T &'일 수도 있습니다. –