[英]Does std::is_nothrow_move_constructible require a noexcept destructor?
[英]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.