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

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)

好建议永远不要像这样过载.

  • 注意技术术语"精确匹配"(13.3.3.1.1)适用于所有十二个隐式转换序列.可能更安全地说"赢,除非参数是'常量'左值". (2认同)