Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/magento/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ std::deque是可移动构造的,但不是';诺思罗';_C++_C++17_Move_Move Semantics_Move Constructor - Fatal编程技术网

C++ std::deque是可移动构造的,但不是';诺思罗';

C++ std::deque是可移动构造的,但不是';诺思罗';,c++,c++17,move,move-semantics,move-constructor,C++,C++17,Move,Move Semantics,Move Constructor,这个问题很简单,在标题中进行了总结。有什么特别的原因可以解释这种情况吗?考虑到对象可以有效地交换内部状态,我肯定这里有一些我忽略的东西…当两个数据块交换时,它们都处于一些有效的构造状态。因此,交换只需要交换它们的内部,大部分是指针或整数(加上分配器) 但是,当您移动构造一个deque时,您需要将从deque移动到一个有效的状态,很可能是默认构造的状态。这可能需要一些可能抛出的操作,例如动态内存分配 例如,在libstdc++中,deque的移动构造函数(及其默认构造函数)调用\u deque\u

这个问题很简单,在标题中进行了总结。有什么特别的原因可以解释这种情况吗?考虑到对象可以有效地交换内部状态,我肯定这里有一些我忽略的东西…

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

但是,当您移动构造一个deque时,您需要将从deque移动到一个有效的状态,很可能是默认构造的状态。这可能需要一些可能抛出的操作,例如动态内存分配

例如,在libstdc++中,deque的移动构造函数(及其默认构造函数)调用
\u deque\u base::\u M\u initialize\u map(0)
。此成员功能:


事实上,它至少分配了8个映射节点,因为当交换两个数据块时,它们都处于一些有效的构造状态。因此,交换只需要交换它们的内部,大部分是指针或整数(加上分配器)

但是,当您移动构造一个deque时,您需要将从deque移动到一个有效的状态,很可能是默认构造的状态。这可能需要一些可能抛出的操作,例如动态内存分配

例如,在libstdc++中,deque的移动构造函数(及其默认构造函数)调用
\u deque\u base::\u M\u initialize\u map(0)
。此成员功能:


事实上,它至少分配了8个映射节点,因为
\u S\u initial\u map\u size

我的直觉反应是,“其他容器在修改之前可以是空的”-但我认为您的思路是正确的-插入/修改的
std::deque
复杂性边界强制(默认)构造函数在堆上设置一些数据结构-即使大小为零。我的直觉反应是,“其他容器在修改之前可以是空的”-但我认为您的思路是正确的-插入/修改的
std::deque
复杂性边界强制(默认)构造函数在堆上设置一些数据结构-即使大小为零。
deque
不要求是可构造的,但允许是可构造的。这里是一个流行的实现的调查:@ HooAdHurnNo:不是每天你从LBC+++作者那里得到一个直接答案:)查看我当前的(CLAN-90.1)C++头,很明显,<<代码>除了限定符,本质上取决于底层分配器属性。放松的需求是有理由的,还是只是惯性?惯性。对于C++11中的实现者来说,这是一个太大的要求。但我听到谣言说,实现者正在朝着使一切
noexcept
的方向发展。事实上,我最近没有重新检查我的调查,我可能应该这样做。它可能已经过时了。也许很快我们就可以标准化这个领域的现有实践(祈祷吧)。我无法解释为什么有人会在没有指出问题中的一个主要缺陷的情况下否决这个问题——特别是当我收到一位图书馆作者的反馈时
deque
不要求是可构造的,但允许是。这里是一个流行的实现的调查:@ HooAdHurnNo:不是每天你从LBC+++作者那里得到一个直接答案:)查看我当前的(CLAN-90.1)C++头,很明显,<<代码>除了限定符,本质上取决于底层分配器属性。放松的需求是有理由的,还是只是惯性?惯性。对于C++11中的实现者来说,这是一个太大的要求。但我听到谣言说,实现者正在朝着使一切
noexcept
的方向发展。事实上,我最近没有重新检查我的调查,我可能应该这样做。它可能已经过时了。也许很快我们就可以标准化这个领域的现有实践(祈祷吧)。我无法解释为什么有人会在没有指出问题中的一个主要缺陷的情况下否决这个问题——特别是当我收到一位图书馆作者的反馈时!
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);