[英]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.