移出向量是否保證為空?
一般來說,C 標準對之後的物件狀態提供了最低限度的指導他們已被搬離。如 N3485 17.6.5.15 [lib.types.movedfrom]/1 所述:
C 標準庫中定義的類型的物件可以從 (12.8) 移出。移動操作可以明確指定或隱式產生。除非另有規定,此類移出的對象應置於有效但未指定的狀態。
雖然此規定並不排除向量受到此行為的影響,但它留下了解釋的空間。
Vector 的特定行為
沒有明確的標準要求來排除向量受到移出物件的一般規則的影響。然而,考慮到向量實現的要求,選項有限:
移動構造函數:
移動賦值運算子:
情況一:
情況二:
A>::propagate_on_container_move_assignment::value == false 且 get_allocator() == v.get_allocator()
與情況一類似的行為,但分配器不會移動。分配器無法移動,資源無法從 v 轉移到 *this。
唯一的實作方式移動分配是使用分配操作將每個 T 從 v 單獨移動到 *this。 這要求 T 是 MoveAssignable 或 MoveInsertable(取決於 *this 中容量和大小的可用性)。 結論:對於向量的移動建構函數,移出向量永遠為空。對於移動賦值運算符,移出向量通常為空,但在分配器不相容且 T 為 MoveAssignable 或 MoveInsertable 的某些特定場景中可能不是空的。
以上是移自 `std::vector` 是否保證為空?的詳細內容。更多資訊請關注PHP中文網其他相關文章!