2013-01-17 110 views
30

std :: array是否可移動?是std :: array可移動嗎?

Bjarne Native 2012 presentation slides(幻燈片41)中,它列出了std :: array作爲唯一不可移動的容器之一。

快速查看上的gcc 4.8庫源代碼似乎證實的std ::陣列是不可移動的:

的std ::向量:

/* @brief %Vector move constructor. 
    ...  */ 
    vector(vector&& __x) noexcept 
    : _Base(std::move(__x)) { } 

而在標準::陣列的唯一方法接收一個右值引用參數是隨機元素訪問,從而避免了通過複製一回:

get(array<_Tp, _Nm>&& __arr) noexcept 
    { /*...*/ return std::move(get<_Int>(__arr)); } 

是布展構造&移動assignement爲std ::數組默認創建,或者是std ::數組不可移動?如果它是不可移動的,爲什麼std :: array不能移動,而std :: vector可以?

+0

作爲一個興趣點,單獨存在或不存在移動構造函數不足以確定類型是否爲可移植的構造(如果使用關於此問題的表達/面向概念的視圖,就像最共同)。類似的移動分配。 –

回答

39

std::array只有當其包含的物體可移動時纔可移動。

std::array與其他容器完全不同,因爲容器對象包含存儲,而不僅僅是指向堆的指針。移動std::vector只複製一些指針,並且包含的​​對象不明智。

是的,std::array使用默認的移動構造函數和賦值運算符。作爲聚合類,不允許定義任何構造函數。

+1

而數組的默認移動構造函數移動每個元素? –

+9

@SethCarnegie它移動構造成員數組,它移動它的每個元素。 – Potatoswatter

+3

謝謝!所以std ::數組中的移動操作是O(n),因爲移動發生在它的元素上,而在std :: vector中它會是O(1)? (因爲在std :: vector的情況下只有指針需要移動) –

相關問題