为什么noexcept move构造函数在向量重新分配期间没有被调用

Why noexcept move constructor is not getting called during vector reallocation?

本文关键字:分配 调用 构造函数 move noexcept 向量 新分配 为什么      更新时间:2023-10-16

我们知道何时将新元素添加到std :: vector(通过push_back(,它可能缺乏它的空间元素,然后从现有块转移到新块。在C 98这是通过复制旧位置的元素然后破坏这些对象完成的,因此,它可以提供强大的异常保证,并且在C 11中可以优化它使用MOVE构造函数,只要不是Except,但是如果我的驱动器是Noexcept(false(会发生什么,为什么没有进行优化?

#include <iostream>
#include <vector>
class X
{
public:
    X()
    {
    }
    X(const X& ob) noexcept
    {
      std::cout<<"Copy Constructor...."<<std::endl;
    }
    X(X&& ob) noexcept
    {
       std::cout<<"Move Constructor...."<<std::endl;
    }
    ~X() noexcept(false)
    {
    }
};
int main()
{
   std::vector<X> myobs;
   for(int i=0;i<1000;i++)
   {
      myobs.push_back(X());
   }
   return 0;
}

为什么在上面的方案中调用复制构造函数,也请注意,如果我将destructor作为noexcept(默认行为(,则只会调用移动构造函数。

增加我对强大的异常保证的理解(在vector :: push_back中(是旧内存中的元素都不被破坏,直到所有人都成功复制,这意味着最后调用了destuructors是noexcept

问题与is_nothrow_move_constructible<T>的规范有关,目前指定了该表达式是否表达式

T(declval<T&&>())

是毫无疑问的,但这涉及(临时(的破坏者以及移动构造函数。可以说,这是一个正在进行的LWG 2116的库缺陷。GCC遵循规范是正确的。规格本身不好。