为什么不将RVALUE引用定义为RVALUE表达

Why not define rvalue reference to be rvalue expression?

本文关键字:RVALUE 表达 定义 引用 为什么不      更新时间:2023-10-16

让我们考虑以下代码:

class X {
    std::vector<int> _v;
public:
    X(std::vector<int>&& v): _v(std::move(v)) {}
};

编译器仅针对可以移动的对象调用此构造函数。那么,为什么不将rvalue引用定义为rvalue表达式,也不要每次写下std ::移动呢?

CTOR成员初始化列表看起来像:

_v(v)

,但这仍然是一个动作,而不是副本。

虽然在这种常见情况下需要std::move有些不幸,但人们认为在某些情况下导致运行时错误的隐性移动会更有害处。

例如:

class Y
{
public:
    Y(const std::vector<int>& v);
};
class X {
    std::vector<int> v_;
    Y                y_;
public:
    X(std::vector<int>&& v): v_(v), y_(v) {}
};

在此修改后的示例中,X的构造函数两次使用v。如果v的首次使用隐式移动,那么v的第二次使用很可能不会获得预期值。

因此,为了避免偶然的"移动后使用",如果它具有名称,则可以多次使用,因此将其视为lvalue。