我从原始文章中看到了这句话:
当我们对右值进行排序时,对数据成员进行排序是安全的 直。该对象是一个右值,表示它没有其他用户, 因此我们可以更改对象本身。当我们对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();
}
答案 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
方法。