gpt4 book ai didi

c++ - 通用引用与常量引用优先级?

转载 作者:IT老高 更新时间:2023-10-28 22:27:51 24 4
gpt4 key购买 nike

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

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
}

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

关于c++ - 通用引用与常量引用优先级?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18264829/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com