根据此文件:

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

  • l值具有标识并且不可移动。
  • pr值是可移动的,但没有标识。
  • x值具有标识并且可以移动。

  • 关于这些我有几个问题。

    一种。具有身份的x值的示例是什么?以下内容不合法:
    Foo f;
    &std::move(f);
    

    b。我可以重载类Foo的&运算符,并使其返回这个,以便使以下内容合法:
    &Foo(5);
    

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

    最佳答案


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

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

    根据§1.7/1:

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


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

    作为后续,给出了一些例子。这是对它们的扩展:

    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
    

    10-07 22:44