通用引用与常量引用优先级

universal reference vs const reference priority?

本文关键字:引用 优先级 常量      更新时间:2023-10-16

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

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

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

现在考虑一个函数有一个通用引用和一个常量引用版本的情况:

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

我的问题是:无论x的类型如何(r值引用、引用、cv限定符、指针…),它们在这两个函数之间是否具有通用优先级,就像前面的情况一样?(如果是,优先级是多少?)

这两个函数之间没有通用的优先级。它们在过载解决算法中竞争同样激烈。一般来说,所谓的"通用参考"获胜,除非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
}

好的建议是永远不要像这样超载。