Q
移動構造函數簽名
8
A
回答
9
可移動物體如何成爲
const
?
它不能,但那不是語言所說的。該語言表示具有該簽名的構造函數是一個「移動構造函數」,但這並不意味着該參數被移出,而只是意味着構造函數符合「移動構造函數」的要求。移動構造函數不需要移動任何東西,如果參數是const
它不能。
有沒有這種情況下這種聲明是有用的?
是的,但不是很經常。如果要防止在const臨時變量作爲參數傳遞時通過重載解析來選擇另一個構造函數,這會很有用。
struct Type
{
template<typename T>
Type(T&&); // accepts anything
Type(const Type&) = default;
Type(Type&&) = default;
};
typedef const Type CType;
CType func();
Type t(func()); // calls Type(T&&)
在此代碼func()
臨時返回將不完全匹配的複製或移動建設者的參數,所以會調用接受任何類型的模板構造。爲了防止這種情況,你可以提供不同的過載取一個const右值,並委託授權的拷貝構造函數:
Type(const Type&& t) : Type(t) { }
或者,如果你想防止代碼編譯,將其定義爲刪除:
Type(const Type&& t) = delete;
有關使用const rvalue引用的標準示例,請參閱https://stackoverflow.com/a/4940642/981959。
0
有關此功能意圖的一些背景知識。
Rvalue references - From Bjarne Stroustrup's Blog
A Proposal to Add Move Semantics Support to the C++ Language
一個有趣的問題。我在某處讀過Stroustrup對這個問題的解釋,但似乎找不到它。希望以上幫助取而代之。
相關問題
- 1. 移動構造函數C++
- 2. 與移動構造函數
- 3. 移動構造函數不移動
- 4. 移動構造函數並移動類
- 5. 與移動構造函數混淆:無法調用移動構造函數
- 6. Move構造函數調用基類移動構造函數
- 7. 移動構造函數和非常拷貝構造函數
- 8. 在簽名中約束構造函數
- 9. C++ - 構造函數,複製構造函數,移動構造函數,析構函數
- 10. Typescript:構造函數字段缺少構造體簽名
- 11. 當移動構造函數被調用
- 12. 移動構造函數和繼承
- 13. 移動構造函數模板elision
- 14. 移動構造函數不工作?
- 15. 用lambda調用移動構造函數
- 16. 移動構造函數過度衝擊
- 17. 關於移動構造函數
- 18. 顯式移動構造函數?
- 19. 默認移動構造函數
- 20. 與移動構造函數問題
- 21. 爲什麼不移動構造函數?
- 22. 明確違約移動構造函數
- 23. googletest移動構造函數覆蓋
- 24. std ::線程移動構造函數
- 25. 瞭解移動構造函數,的std ::移動和析構函數
- 26. emplace_back調用移動構造函數和析構函數
- 27. 移動構造繞過拷貝構造函數
- 28. 手動注入構造函數得到錯誤簽名
- 29. 強制複製構造函數而不是移動構造函數
- 30. 模板構造函數優先於普通副本並移動構造函數?
簡單的回答:不,沒有,因爲它打破了移動語義學的整個目的。還要注意'&&'不一定要說「可移動」。它只是說「右值參考」。並且* MoveConstructible *在沒有移動的情況下會複製,所以你可以說'T const &&'move ctor可能只是複製,但是呃。 – Xeo
好吧,'Type'可以聲明一個'mutable'變量,'mutable'變量*可以''const'移動構造函數修改。因此,一個'const'移動構造函數可以做一個對象的淺拷貝(而一個拷貝構造函數可以做一個深層拷貝),並且在被移動的地方設置一個叫做'dead'的可變布爾標誌或者類似的''true'目的。然後'Type'(最重要的是析構函數)的函數將檢查該標誌。這是無稽之談嗎? –