什么是xvalue和prvalue之间在重载分辨率方面的行为差异的一个具体,简明的例子?

时间:2012-12-22 04:31:57

标签: c++ c++11

我一直在仔细研究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&& atest成功绑定到 xvalues prvalues ,实际区别是什么在重载分辨率方面,xvalues和prvalues之间是什么?

是否存在一个场景示例,其中表达式的xvalue / prvalue性质导致不同的函数重载决策?或者xvalues和rvalues之间的区别仅与语言的其他方面相关,与函数重载决策无关(例如,decltype的结果(即参见What is decltype(0 + 0)?))?

1 个答案:

答案 0 :(得分:2)

我不相信重载决议会有任何不同,没有。

还有很多其他原因可以澄清xvalues和prvalues是什么表达式。 Xvalues是可修改的; prvalues不是。 Xvalues遵守规则,禁止在对象的生命周期之前或之后不正当使用glvalues;这绝不是prvalues的问题。