15

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

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-qualifiers、指针...)如何,它们是否是这两个函数之间的普遍优先级,就像前一种情况一样?(如果是,优先级是什么?)

4

1 回答 1

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
}

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

于 2013-08-16T02:41:15.010 回答