【问题标题】:What is one specific, concise example of a difference in behavior, in terms of overload resolution, between an xvalue and a prvalue?在重载决议方面,xvalue 和 prvalue 之间的行为差​​异的一个具体、简洁的例子是什么?
【发布时间】:2012-12-09 14:53:15
【问题描述】:

数周以来,我一直在仔细研究右值和右值引用。我越来越有信心清楚地理解以下两者之间的区别:

  • 变量或函数参数的类型定义(即int x; vs. 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 表达式。 (如果我对此有误解,请纠正我。)

我的问题是:由于函数参数A&& atest 成功绑定到 xvaluesprvalues,xvalues 和 prvalues 之间的实际区别是什么在重载分辨率方面?

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

【问题讨论】:

    标签: c++ c++11


    【解决方案1】:

    我认为重载解决方案不会有任何区别,不会。

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

    【讨论】:

    • 请注意 goo() = A(); 在 Visual Studio 2012 中成功构建和运行(据称它实现了与右值引用相关的所有 C++11 功能) - 因为它的左侧是纯右值表达式(如果我是正确的),这似乎是一个prvalue被认为是可修改的例子?
    • 为了与 C++03 向后兼容,类的默认赋值运算符允许左侧为左值或右值。你可以通过定义来使一个类更像基本类型:A& operator=(const A&) &;
    • 代码行 A& operator=(const A&) &; 无法在 Visual Studio 2012 中编译(当包含在 A 的类定义中时)。我不熟悉成员函数声明后& 符号的语法 - 你能指点一下吗?
    • @Dan :VC++(甚至 2012 年)不支持该语法;它通常被称为“*this 的移动语义”,在N2439 中有描述。
    猜你喜欢
    • 2013-03-07
    • 2021-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多