2016-06-30 65 views
0

我使用這個類的功能,而不是我寫的,我不能改變它的代碼:移動成需要常量左值參考

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

不幸的是,你不能從一個'const'對象移動。這就是爲什麼赫伯特薩特建議「想要速度?通過價值」。使用該構造函數,您無法避免複製構造或複製任務 – WhiZTiM

回答

0

A類的聲明明確指出,GETVAL不得修改對象和返回的參考不應該被用來要麼改變及其指針,這樣你就不會允許使用在移動。

這就是說,因爲d_val沒有聲明爲const,所以你可以使用const-cast去除引用上的常量,但是你必須知道它是不好的,應該避免。

話雖這麼說,你不能,如果你想一招assignement使用setVal,但您可以手動生成的舉動:

A a; 
Val val; 
// populate val 

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

我不明白const轉換如何工作,我不能更改'A'的代碼。 – ytoledano