c++ - 通用参考 vs 常数参考优先级?

  显示原文与译文双语对照的内容
0 0

当我考虑以下两个重载:

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 )

时间:原作者:2个回答

0 0

这两个函数之间没有一种通用的优先级。 同样在重载方案竞争算法。 通常所谓的" 通用引用" wins,除非 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
}

过人的建议是 重载如下所示。

原作者:
...