说xvalues有身份并可移动是否正确?

时间:2014-03-15 23:20:30

标签: c++ c++11 rvalue-reference

根据这份文件:

http://www.stroustrup.com/terminology.pdf

  1. l值具有同一性且不可移动。
  2. pr值可移动,但没有身份。
  3. x值具有身份并且可以移动。
  4. 我对这些问题有几个问题。

    一个。具有身份的x值的例子是什么?以下是不合法的:

    Foo f;
    &std::move(f);
    

    湾我可以重载Foo类的& -operator并使其返回 this ,以便以下内容合法:

    &Foo(5);
    

    但像Foo(5)这样的公关值不能具有同一性。还是对身份有一个更微妙的解释?

2 个答案:

答案 0 :(得分:4)

  

或者对身份有更微妙的解释吗?

您链接的文档包含以下两个定义:

  
      
  • “具有身份” - 即地址,指针,用户可以确定是否有两个副本   相同等。
  •   
  • “可以从”移动“ - 即我们被允许在某些不确定的地方留下”副本“的来源,   但是有效状态
  •   

看一下标准,我们可以收集对象的定义(按照§1.8/ 1):

  

对象是存储区域。

根据§1.7/ 1:

  

每个字节都有一个唯一的地址。

有一个地址。这意味着定义非常广泛,几乎包含任何类型值的每个对象(rvalue,xvalue,prvalue,lvalue等)。


  

具有身份的x值的示例是什么?

标准本身给出了生成xvalues的表达式列表(在§5/ 7中):

  

表达式是xvalue,如果它是:

     
      
  • 调用函数的结果,无论是隐式还是显式,其返回类型是右值引用   对象类型,
  •   
  • 强制转换为对象类型的右值引用,
  •   
  • 一个类成员访问表达式,指定非引用类型的非静态数据成员,其中对象表达式是xvalue,或
  •   
  • a。*指向成员的表达式,其中第一个操作数是xvalue,第二个操作数是指向数据成员的指针。
  •   
     

通常,此规则的作用是将命名的右值引用视为左值,将对象的未命名右值引用视为xvalues;对函数的右值引用被视为左值,无论是namedornot。

作为后续行动,我们举了几个例子。这是对它们的扩展:

struct A { int m; };

A&& operator+(A, A);
A a;
A b;
a + b;   // xvalue

A&& f();
f();     // xvalue
f().m;   // xvalue

A a;
static_cast<A&&>(a);  // xvalue
std::move(a);         // xvalue

答案 1 :(得分:4)

Stroutrup的The C ++ Programming Language中的这一行可能会清除这个问题:

  

... std :: move(vs)是一个xvalue:它显然具有标识(我们可以将其称为vs),但是我们明确地允许通过调用std :: move来移动它() )(§3.3.2,§35.5.1)。