簡體   English   中英

std::deque 是可移動構造的,但不是“nothrow”

[英]std::deque is move constructible, but not 'nothrow'

問題很簡單,總結在標題中。 有什么特別的理由為什么會這樣嗎? 鑒於對象可以有效地交換內部狀態,我確信這里有一些我忽略的東西......

當兩個雙端隊列交換時,它們都處於一些有效的構造狀態。 因此,交換只需要交換它們的內部結構,它們主要是指針或整數(加上分配器)。

但是,當您移動構造一個雙端隊列時,您需要使移動后的雙端隊列進入有效狀態,可能是默認構造的狀態。 這可能需要一些可能拋出的操作,例如動態內存分配。

例如,在libstdc++ 中,deque 的移動構造函數(以及它的默認構造函數)調用_Deque_base::_M_initialize_map(0) 此成員函數至少分配 2 個“映射”節點

this->_M_impl._M_map_size = std::max((size_t) _S_initial_map_size,
                              size_t(__num_nodes + 2));
this->_M_impl._M_map = _M_allocate_map(this->_M_impl._M_map_size);

實際上,它至少分配了 8 個映射節點,因為_S_initial_map_size 設置為 8

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM