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

Why a lvalue cannot change itself. What's the mean of lvalue user?

本文关键字:是什么 意思 用户 改变自己 不能 为什么      更新时间:2023-10-16

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

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

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

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

下面是一些示例情况的代码。

#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();
}

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方法。