【问题标题】:Why not define rvalue reference to be rvalue expression?为什么不将右值引用定义为右值表达式?
【发布时间】:2019-06-30 18:24:30
【问题描述】:

让我们考虑以下代码:

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

编译器仅对可移动的对象调用此构造函数。那么为什么不直接将右值引用定义为右值表达式,而不是每次都为它们编写 std::move 呢?

ctor 成员初始化列表如下所示:

_v(v)

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

【问题讨论】:

标签: c++ c++11 move-semantics rvalue-reference


【解决方案1】:

虽然在这种常见情况下需要 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 很可能不会获得预期值。

这样为了避免意外的“移动后使用”,如果它有名字,那么它可以被多次使用,因此将它作为左值处理更安全。

【讨论】:

  • 为什么不为这种罕见的情况引入一个右值引用左值,而不是引入一个std::do_not_move
  • @xskxzr std::do_not_move 返回什么类型?
猜你喜欢
  • 1970-01-01
  • 2015-12-13
  • 1970-01-01
  • 2016-01-09
  • 1970-01-01
  • 1970-01-01
  • 2013-04-28
  • 1970-01-01
相关资源
最近更新 更多