std::deque 是可移动构造的,但不是“nothrow”

Bre*_*ale 5 c++ move move-constructor move-semantics c++17

问题很简单,标题里已经概括了。是否有任何特殊原因导致这种情况?鉴于对象可以有效地交换内部状态,我确信这里有一些我忽略的东西......

Dan*_*ica 3

当两个双端队列交换时,它们都处于某些有效的构造状态。因此,交换只需要交换它们的内部结构,其中大部分是指针或整数(加上分配器)。

但是,当您移动构造双端队列时,您需要将移出的双端队列置于有效状态,可能是默认构造的状态。这可能需要一些可能抛出异常的操作,例如动态内存分配。

例如,在libstdc++中,deque 的移动构造函数(及其默认构造函数)调用_Deque_base::_M_initialize_map(0). 该成员函数分配至少 2 个“map”节点

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);
Run Code Online (Sandbox Code Playgroud)

事实上,它至少分配 8 个映射节点,因为_S_initial_map_size 设置为 8