为什么左值不能改变自己。左值用户是什么意思?
Why a lvalue cannot change itself. What's the mean of lvalue user?
我从一篇原始文章中看到了这句话:
当我们在右值上运行排序时,对数据成员进行排序是安全的 径直。该对象是一个右值,这意味着它没有其他用户, 因此,我们可以更改对象本身。当我们在常量上运行排序时 右值或在左值上,我们无法更改此对象,因此我们复制数据 在排序之前
它说右值(临时(可以自行排序,因为它没有用户。 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
方法。
相关文章:
- 这个语法std::class<>{}(arg1, arg2) 在C++中是什么意思?
- 标准 N3337 5.2.10 第 7 条中的C++"类型"是什么意思?
- "类模板示例<int>;"语句对 C++11 是什么意思?
- 线应该是什么意思
- "CID"在AT+HTTPPARA= "CID" ,1中是什么意思
- 表达式"b=(b-x)&x"是什么意思?
- 这个表达是什么意思?
- 此代码验证公式是什么意思?
- 跟踪日志中的T.11803()是什么意思?
- 这个额外的关键字在这个 c++ 类声明中是什么意思?
- * 和 ** 在 C++ 函数声明中是什么意思?
- _T("xyz")是什么意思?
- #define Dbg(fmt,..) (0) 是什么意思? 警告:表达式无效
- 这行代码到底是什么意思?
- 在命名空间名称之前加上 :: 是什么意思?
- 从字符数组的元素中减去'a'是什么意思
- "friend"关键字在C++中是什么意思?
- 减法中的"0"是什么意思?
- 字符数组前面的加号是什么意思?
- 这里的字符串函数是什么意思