通用引用与常量引用优先级
universal reference vs const reference priority?
当我考虑以下两个重载时:
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++中返回常量引用是个好主意
- 我想将一个对T类型的非常量左值引用绑定到一个T类型的临时值
- 何时在引用或唯一指针上使用移动语义
- 如何在c++中使用引用实现类似python的行为
- 编译C++时未定义的引用
- Ctypes wstring通过引用传递
- C++优先级队列,按对象的唯一指针的特定方法升序排列
- c++r值引用应用于函数指针
- 理解c++中的引用
- C++取消引用指针.为什么会发生变化
- 交换优先级队列时尝试引用已删除的函数错误
- 为什么 C++ 中指向方法取消引用运算符的指针具有如此低的优先级
- 函数重载优先级(引用)
- 通过引用传递自定义优先级队列
- 通过引用传入优先级队列
- 修改对内部数据的引用时更新 STL 优先级队列
- 通用引用与常量引用优先级
- 是否有一条规则或优先级可以选择值/指针/引用
- 将节点引用到优先级队列(迭代器)中