作者热门文章
- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
几个星期以来,我一直在仔细研究右值和右值引用。我越来越有信心,我对以下两者之间的区别有了一定的了解:
int x;
与 int && x = …;
A&& foo()
,以及给定的表达式仅包含foo()
的表达式类别是“xvalue”)foo
的相同定义,在包含表达式中使用时,子表达式 foo()
的类型 是A
(不是A&&
))。我的问题是关于 xvalue 表达式和 prvalue 表达式(这两个表达式类别都是右值)之间的区别。
给定:
class A
{};
A&& foo() {…}
A goo() {…}
void test(A&& a) {…}
int main()
{
test(foo()); // test() called with xvalue expression
test(goo()); // test() called with prvalue expression
}
请注意,函数 test()
已使用 xvalue 表达式和 prvalue 表达式成功调用。 (如果我对此有误解,请指正。)
我的问题是:由于 test
的函数参数 A&& a
成功绑定(bind)到 xvalues 和 prvalues,在重载决议方面,xvalues 和 prvalues 之间的实际区别是什么?
是否有表达式的 xvalue/prvalue 性质导致不同函数重载决议的场景示例?还是 xvalues 和 rvalues 之间的区别仅与语言的其他方面相关,与函数重载决策无关(例如,decltype
的结果(即,参见 What is decltype(0 + 0)? ))?
最佳答案
我认为重载决议不会有任何不同,不。
不过,还有很多其他原因可以阐明哪些表达式是 xvalues 和 prvalues。 Xvalues 是可修改的;右值不是。 Xvalues 受制于在对象生命周期之前或之后不正确使用 glvalues 的规则;这从来都不是纯右值的问题。
关于c++ - 在重载决议方面,xvalue 和 prvalue 之间的行为差异的一个具体、简洁的例子是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14000076/
我是一名优秀的程序员,十分优秀!