我寫了一個簡單的鏈表,因爲最近的一次面試編程挑戰讓我看到了C++的生鏽程度。在我的列表中,我聲明瞭一個私人拷貝構造函數,因爲我想明確地避免製作任何拷貝(當然還有懶惰)。當我想通過擁有我的一個列表的值返回一個對象時,我遇到了一些麻煩。返回值優化和私人拷貝構造函數
class Foo
{
MyList<int> list; // MyList has private copy constructor
public:
Foo() {};
};
class Bar
{
public:
Bar() {};
Foo getFoo()
{
return Foo();
}
};
我得到一個編譯器錯誤,說我MyList有一個私人拷貝構造函數,當我嘗試按值返回一個Foo對象時。應該使用Return-Value-Optimization否定任何複製的需要?我是否需要編寫一個拷貝構造函數?我從來沒有聽說過移動構造函數,直到我開始尋找這個問題的解決方案,那是最好的解決方案嗎?如果是這樣,我將不得不閱讀它們。如果不是,那麼解決這個問題的首選方法是什麼?
RVO是一種優化。如果你不允許複製構造,那麼你將無法複製構造。如果你允許的話,可以申請RVO。 – mfontanini
優化不應改變行爲,相反,編譯器只有在可以保證預期行爲時才能執行優化。要通過複製返回,該對象必須是可複製的。 – lvella
@lvella:儘管在這種情況下,優化*被允許改變行爲 - 即使副本有副作用也可以省略副本。但是您確認複製構造函數必須可訪問。 –