进入一个采用const左值引用的函数

时间:2016-06-30 07:52:10

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

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

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

1 个答案:

答案 0 :(得分:0)

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

话虽如此,由于d_val未被声明为const,您可以使用const-cast来删除引用上的const,但是您必须知道它是坏的并且应该避免。

话虽如此,如果您想要移动设置,则无法使用setVal,但您可以手动生成移动:

A a;
Val val;
// populate val

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