【问题标题】:Move into a function that takes const lvalue reference移入一个接受 const 左值引用的函数
【发布时间】:2016-06-30 07:52:10
【问题描述】:

我正在使用这个类,不是我写的,我不能改变它的代码:

class A {
private:
    Val d_val;
public:
    void setVal(const Val& val) { d_val = val; }
    const Val& getVal() const { return d_val; }
};

Val 支持移动,但编写 A 类时没有考虑到这一点。我可以在场景中以某种方式避免val 的副本吗?我怀疑 std::move(val)setVal 会起作用,因为它不需要 r 值引用。

A a;
Val val;
// populate val
a.setVal(val); // I don't need val after here

【问题讨论】:

  • 很遗憾,您无法从const 对象中移动。这就是为什么 Herb Sutter 建议“想要速度?通过价值”。使用该构造函数,您无法避免复制构造或复制分配

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


【解决方案1】:

A 类中的声明明确声明 getVal 不应修改对象,返回的引用也不应用于更改其指针对象,因此不允许在移动中使用它。

话虽如此,由于d_val 未声明为 const,因此您可以使用 const-cast 来删除引用上的 constness,但您必须知道这是不好的,应该避免。

话虽如此,如果您想要移动分配,则不能使用setVal,但您可以手动生成移动:

A a;
Val val;
// populate val

Val& av = const_cast<Val &>(a.getVal()); // cheating compiler...
av = std::move(val);

【讨论】:

  • 我不明白 const cast 是如何工作的,我无法更改 A 的代码。
猜你喜欢
  • 1970-01-01
  • 2015-12-19
  • 2017-12-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-12
相关资源
最近更新 更多