為什麼std::Move 可以在常數物件上使用
通常,在常數物件上呼叫std::move 似乎不合邏輯,因為人們期望移動或修改該物體。然而,在 C 11 中,允許在常數物件上使用 std::move。
詳細說明,std::move(cat) 並不表示該物件實際上已移動。相反,它指示編譯器嘗試移動。如果類別沒有定義接受對右值的 const 引用的建構函式(例如 const Cat&&),編譯器將使用對左值複製建構函式的隱式 const 引用,從而執行安全複製。
考慮以下範例:
struct Cat { Cat(){} Cat(const Cat&) {std::cout << "COPY";} Cat(Cat&&) {std::cout << "MOVE";} }; int main() { const Cat cat; Cat cat2 = std::move(cat); }
即使使用了 std::move,也會輸出「COPY」訊息,表示物件被複製而不是移動。
此行為作為安全機制。如果停用複製建構函數,編譯器會向開發人員提示錯誤訊息。
此外,Scott Meyers 的《Effective Modern C》一書中提到的 bug 不是穩定性問題,而是效能問題。當打算移動時執行隱式複製時會發生這種情況,導致執行速度變慢。此外,即使對於缺少移動建構函數的非常量對象,也可能會出現此類錯誤。
最終,允許 std::move 對常數物件進行操作提供了靈活性。如果需要,開發人員保留從 const 右值引用明確建構物件的能力。
以上是為什麼可以在 C 中的常數物件上使用 `std::move` ?的詳細內容。更多資訊請關注PHP中文網其他相關文章!