当前位置: 首页 > 知识库问答 >
问题:

默认的移动构造函数是否定义为noexcept?

子车煌
2023-03-14

似乎一个向量会检查move构造函数是否标记为noexcept,然后再决定重新分配时是移动还是复制元素。默认的移动构造函数是否定义为noexcept?我看到了以下文档,但它没有指定这一点。http://en.cppreference.com/w/cpp/language/move_constructor

隐式声明移动构造函数

如果没有为类类型(struct,类或联合),并且以下所有都是真的:没有用户声明的复制构造函数没有用户声明的复制赋值运算符没有用户声明的移动赋值运算符没有用户声明的析构函数隐式声明的移动构造函数由于下一节详述的条件没有被定义为已删除,那么编译器将声明一个移动构造函数为其类的内联公共成员,其签名为t::t(t&&)类可以有多个移动构造函数,例如t::t(const t&&)和t::t(t&&)。如果存在某些用户定义的move构造函数,则用户仍可能强制使用关键字default生成隐式声明的move构造函数。

共有1个答案

钱繁
2023-03-14

我想答案是15.4/14(异常规格):

继承构造函数(12.9)和隐式声明的特殊成员函数(第12条)有一个异常规范。如果f是继承构造函数或隐式声明的默认构造函数、copy构造函数、move构造函数、析构函数、copy赋值运算符或move赋值运算符,则其隐式异常规范指定类型-idt当且仅当f的隐式定义直接调用的函数的异常规范允许tf允许所有异常,如果它直接调用的任何函数都允许所有异常,则它允许所有异常;如果它直接调用的每个函数都不允许异常,则f具有异常规范noexcepting(true)

基本上,它做您想做的事情,并且隐式声明的move构造函数在任何时候都是noexcept

 类似资料:
  • 我有一个记录,想添加默认构造函数。 但是它创建了带有参数的构造函数。 我们如何将默认构造函数添加到记录中?

  • 问题内容: 我有一条记录,想要向其中添加默认构造函数。 但是它创建了带参数的构造函数。 我们如何向记录添加默认构造函数? 问题答案: 为了分裂头发,您永远无法定义默认构造函数,因为在没有定义构造函数的情况下,编译器会生成默认构造函数,因此根据定义,任何定义的构造函数都不是默认构造函数。 如果希望记录具有无参数构造函数,则记录确实允许添加额外的构造函数或工厂方法,只要调用将所有记录字段作为参数的“规

  • 问题内容: 我有一些简单的Java代码,其结构与此类似: 我将有很多的子类,每个子类以自己的方式(模板方法模式)实现方法。 这很好用,但是我不喜欢子类中有多余的构造函数。输入更多,难以维护。如果要更改构造函数的方法签名,则必须更改所有子类。 当我从子类中删除构造函数时,出现此编译时错误: 我想做的事可能吗? 问题答案: 你会收到此错误,因为没有构造函数的类具有默认构造函数,该构造函数没有参数,并且

  • 问题内容: 默认构造函数到底是什么?你能告诉我以下哪个是默认构造函数,它与其他构造函数有何不同? 问题答案: 他们都不是。如果定义,则不是默认值。 除非你定义另一个构造函数,否则默认构造函数是自动生成的无参数构造函数。任何未初始化的字段都将设置为其默认值。对于你的榜样,它看起来像这样假设的类型String,int以及int,那类本身是公共的: 这与 完全没有构造函数。但是,如果定义至少一个构造函数

  • 可以定义一个(a)没有用户定义的构造函数,以及(b)无法生成默认构造函数。例如,下面的: 您仍然可以使用聚合初始化创建Foo的实例: 我的普通编译器(VS2012)将勉强接受这一点,但它提出了两个警告: 警告C4510:'Foo':无法生成默认构造函数。 警告C4610:结构“Foo”永远不能实例化-需要用户定义的构造函数 当然,我刚刚证明了警告#2是错误的——您仍然可以使用聚合初始化来实例化它。

  • 隐式默认构造函数有一个空主体和一个空初始值设定项列表(未定义的原始类型,默认构造函数用于用户定义的类型)。 这篇帖子说 确实进行了成员级值初始化,但在进行初始化时调用默认构造函数有什么意义 ? 是否调用隐式默认构造函数,以确保调用用户定义类型(可能具有非平凡的默认构造函数)的默认构造函数? 使现代化 似乎在调用编译器生成的隐式默认构造函数后,对象可能无法一致实例化,即未定义基元类型,并且用户定义的