通用引用vs const引用优先级?

时间:2013-08-16 02:21:00

标签: c++ templates c++11 reference universal-reference

当我考虑以下两个重载时:

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

我保证f(x)将始终调用第二个函数,并且永远不会导致歧义。从某种意义上说,无论其类型如何,第二个版本与一个参数的第一个版本相比具有普遍的优先级。

现在考虑一下通用引用和函数的const引用版本的情况:

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

我的问题是:无论x的类型(r值引用,引用,cv限定符,指针......)与前一种情况一样,它们是这两个函数之间的普遍优先级吗? (如果是,优先级是什么?)

1 个答案:

答案 0 :(得分:17)

这两个功能之间没有普遍的优先权。它们在重载分辨率算法中同等竞争。一般而言,除非const T&完全匹配,并且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
}

好的建议就是从不这样过载。