我一直在仔细研究rvalues和rvalue引用,详细研究了几个星期。我越来越相信我能清楚地理解它们之间的区别:
int x;
与int && x = ...;
A&& foo()
,并给出仅由foo()
组成的表达式,表达类别是“xvalue”)foo
的相同定义,类型在包含表达式中使用的子表达式foo()
的em>是A
(不是A&&
))。我的问题是 xvalue 表达式和 prvalue 表达式之间的区别(这两个表达式类别都是rvalues)。
假设:
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
}
请注意,使用xvalue表达式和prvalue表达式成功调用函数test()
。 (如果我对此有误解,请纠正我。)
我的问题是:由于函数参数A&& a
到test
成功绑定到 xvalues 和 prvalues ,实际区别是什么在重载分辨率方面,xvalues和prvalues之间是什么?
是否存在一个场景示例,其中表达式的xvalue / prvalue性质导致不同的函数重载决策?或者xvalues和rvalues之间的区别仅与语言的其他方面相关,与函数重载决策无关(例如,decltype
的结果(即参见What is decltype(0 + 0)?))?
答案 0 :(得分:2)
我不相信重载决议会有任何不同,没有。
还有很多其他原因可以澄清xvalues和prvalues是什么表达式。 Xvalues是可修改的; prvalues不是。 Xvalues遵守规则,禁止在对象的生命周期之前或之后不正当使用glvalues;这绝不是prvalues的问题。