Vin*_*ent 15 c++ templates reference c++11 universal-reference
当我考虑以下两个重载时:
template <class... T> void f(const T&... x);
template <class T> void f(const T& x);
Run Code Online (Sandbox Code Playgroud)
我有保证f(x)总是会调用第二个函数,并且永远不会导致歧义.从某种意义上说,无论其类型如何,第二个版本与一个参数的第一个版本相比具有普遍的优先级.
现在考虑一下通用引用和函数的const引用版本的情况:
template <class T> void f(T&& x);
template <class T> void f(const T& x);
Run Code Online (Sandbox Code Playgroud)
我的问题是:它们是这两个函数之间的普遍优先级,不管x的类型(r值引用,引用,cv限定符,指针......),如前一种情况?(如果是的话,优先级是多少?)
How*_*ant 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
}
Run Code Online (Sandbox Code Playgroud)
好建议永远不要像这样过载.