当我考虑以下两个重载时:
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限定符,指针......)与前一种情况一样,它们是这两个函数之间的普遍优先级吗? (如果是,优先级是什么?)
答案 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
}
好的建议就是从不这样过载。