繁体   English   中英

为什么不将rvalue引用定义为rvalue表达式?

[英]Why not define rvalue reference to be rvalue expression?

我们考虑以下代码:

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

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

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很可能无法获得预期值。

因此,为了避免意外的“移动后使用”,如果它有一个名称,那么它可以被使用不止一次,因此更安全地将其视为左值。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM