在C 11 中,允許在const 物件上呼叫std::move,這個運算可能看起來不合邏輯考慮到此類對象的不變性。這種行為引起了人們對其可能導致微妙的程式錯誤的擔憂。
但是,值得注意的是 std::move(const) 不會修改實際物件。相反,它只是指示編譯器嘗試移動操作。如果物件不支援移動語義(例如,沒有相容的建構函數),編譯器將自動呼叫複製建構函數。
此行為允許開發人員安全地對可能的物件使用 std::move或可能不支援移動語義。如果移動操作可行,編譯器將有效地轉移所有權,從而優化效能。但是,如果不支援移動,程式碼仍然可以正常運行,儘管會因複製而導致效能損失。
在提供的範例中:
struct Cat { Cat(){} }; const Cat cat; std::move(cat); //this is valid in C++11
std::move( cat) 將有效地呼叫複製建構函數,因為 Cat 沒有定義移動建構函數。因此,保持了物件的 const 性質,並且不會發生錯誤或意外行為。
以Scott Meyers 範例中的Annotation 類別為例:
class Annotation { public: explicit Annotation(const std::string text) : value(std::move(text)) };
編譯器會嘗試呼叫std::string(std::string&&) 建構函數,但由於text 是const, std::move(text) 的實際類型將是const std::string&&,這與所需的std 不符: :細繩&&。因此,將呼叫 std::string(const std::string&) 建構函數,從而導致效能損失,但不會導致錯誤。
因此,雖然呼叫 std::在 const 物件上移動,它本身不會導致錯誤或不穩定。相反,它允許編譯器根據特定物件移動語義的可用性來確定適當的操作,從而實現靈活高效的程式碼。
以上是為什麼 C 11 中的 const 物件允許使用'std::move”?的詳細內容。更多資訊請關注PHP中文網其他相關文章!