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

爸爸迪·哈蒂

我们知道何时将新元素添加到std :: vector(通过push_back),它可能会缺少空间,在这种情况下,vector分配了更大的内存块来容纳所有元素,然后从现有的块转移到新的元素。在C ++ 98中,这是通过从旧位置复制元素然后销毁那些对象来完成的,因此,它可以提供强大的异常保证,而在c ++ 11中,可以使用move构造函数对其进行优化,前提是不例外,但会发生什么情况如果我的析构函数是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;
}

为什么在上述情况下调用Copy Constructor,并且还要注意,如果我将destructor设置为noexcept(默认行为),则只会调用move构造函数。

为了增强对强异常保证的理解(在vector :: push_back中),在成功复制所有内存之前,不会破坏旧内存中的任何元素,这意味着最后将调用析构函数,因此它们是否为noexcept或不

克瑞克SB

问题在于的规范is_nothrow_move_constructible<T>,目前已指定该规范以检查表达式是否

T(declval<T&&>())

也不例外,但是涉及(临时的)析构函数以及move构造函数。可以说这是库缺陷,这是正在进行的LWG 2116的主题GCC正确遵循了规范;规范本身就是不好的。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么即使没有重新分配输入变量,在我的递归调用期间它也会改变?

尽管传递了右值,为什么我的move构造函数没有被调用?

重新分配的函数调用时出错,为什么?

std :: vector不会使用带有noexcept move构造的对象调用move构造函数

为什么我的子类构造函数没有被调用?

为什么没有调用 Cups 类的构造函数?

为什么我的 additionalChoices 构造函数没有被调用?

为什么重新分配失败并带有临时指针

为什么不重新分配超级方法会导致稍后重新调用该重新分配的方法?

为什么未调用move构造函数?

为什么不调用move构造函数

为什么用户定义的复制构造函数调用基本构造函数,而默认的复制构造函数没有?

cpp没有匹配的函数调用来调用构造函数。为什么?

在向量中使用没有副本且没有noexcept move构造函数的对象。实际中断了什么,如何确认?

为什么即使没有内存重新分配,在for循环中调用push_back也不安全?

为什么代码没有将类重新分配给 id 标签而是中断?

为什么在 JavaScript 中没有重新分配循环内的“常量”变量?

C ++:没有匹配的调用函数:为什么需要一个空的构造函数?

为什么仅在向量中已经有元素时才调用move构造函数?

为什么此函数不调用move构造函数?

如果没有noexcept move构造函数,为什么带有std :: vector的代码不能编译却带有std :: unique_ptr的代码可以编译?

如果 std::vector 使用移动构造函数将对象重新分配到新内存,那么为什么必须在原始对象上调用析构函数?

C ++ 11:带有std :: move()的'decltype类实例声明'不调用'move构造函数'。为什么?

Python3:为什么在重新分配新对象变量后调用 __del__?

为什么重新分配功能指针会减慢功能调用

为什么不能重新分配函数表达式的名称?

为什么传递给函数的对象可以被突变但不能在javascript中重新分配?

为什么在最后一行中也没有调用复制构造函数?

为什么我的C#基本构造函数没有被调用?