我正在使用这个课程,不是我写的,我不能改变它的代码:
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
答案 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);