为什么左值不能改变自身。左值用户是什么意思?

时间:2019-10-17 01:22:28

标签: c++ rvalue lvalue

我从原始文章中看到了这句话:

  

当我们对右值进行排序时,对数据成员进行排序是安全的   直。该对象是一个右值,表示它没有其他用户,   因此我们可以更改对象本身。当我们对const进行排序时   右值或左值,我们无法更改此对象,因此我们复制数据   在排序之前

它说一个右值(临时)可以排序,因为它没有用户。 左值无法对其自身进行排序(对其副本进行排序),因为它可能有用户。

什么是左值用户?背景是什么?

这里有一些代码可以说明这种情况。

#include <vector>
#include <algorithm>

using namespace std;

class Foo {
public:
    Foo() { std::cout << "default construct" << std::endl;}
    Foo(const Foo &f) : data(f.data) {std::cout << "copy construct" << std::endl;}
    Foo sort() &&;
    Foo sort() const &;
private:
    vector<int> data;
};

Foo Foo::sort() && {
    std::cout << "rvalue sort" << std::endl;
    std::sort(data.begin(), data.end());
    return *this;
}

Foo Foo::sort() const & {
    std::cout << "lvalue sort" << std::endl;
    return Foo(*this).sort();
}

1 个答案:

答案 0 :(得分:0)

rvalue引用是要不再引用的对象。由于不再引用该对象,因此该对象持有的任何内容都可以更改或移动到另一个对象,而不会影响对该对象的任何现有引用(不再引用)。这允许移动语义,这意味着通常必须复制到另一个对象的数据可以移动。

因此,使用您提供的示例代码...

int main(int argc, char *argv[]) {  

  Foo x, y, z;

  std::cout << "lvalue" << std::endl;

  y = x.sort();

  std::cout << "rvalue reference" << std::endl;

  z = Foo().sort();

  return 0;
}

我们有

default construct
default construct
default construct
lvalue
lvalue sort
copy construct
rvalue sort
copy construct
rvalue reference
default construct
rvalue sort
copy construct

首先发生的是一个lvalue,它调用了sort方法,该方法被复制并成为rvalue引用,然后对其进行排序。

第二件事是默认构造的对象没有名称,因此可以将其视为rvalue引用。因此,直接调用rvalue引用sort方法。