问题很简单,标题中对此进行了概述。是否有任何特殊原因导致这种情况?鉴于对象可以有效地交换内部状态,因此我敢肯定,这里有些事情我正在忽略...

最佳答案

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

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

例如,在 libstdc++ 中,deque的move构造函数(及其默认构造函数)调用_Deque_base::_M_initialize_map(0)。该成员函数allocates at least 2 "map" nodes:

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);

实际上,由于_S_initial_map_size is set to 8,它至少分配了8个 map 节点。

关于c++ - std::deque可 move 构造,但 'nothrow'不可,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/60449532/

10-11 23:06
查看更多