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

bja*_*fly 64 c++ constructor move-semantics c++11

在重新分配时,在确定是否移动或复制元素之前,向量将检查移动构造函数是否标记为noexcept.默认移动构造函数是否定义为noexcept?我看到了以下文档,但没有说明这一点.http://en.cppreference.com/w/cpp/language/move_constructor

隐式声明的移动构造函数

如果没有为类类型(结构,类或联合)提供用户定义的移动构造函数,并且满足以下所有条件:没有用户声明的复制构造函数没有用户声明的复制赋值运算符没有用户声明的移动赋值运算符没有用户声明的析构函数,由于下一节中详述的条件,隐式声明的移动构造函数未定义为已删除,因此编译器将声明移动构造函数作为其类的内联公共成员signature T :: T(T &&)一个类可以有多个移动构造函数,例如T :: T(const T &&)和T :: T(T &&).如果存在一些用户定义的移动构造函数,则用户仍可以使用关键字default强制生成隐式声明的移动构造函数.

Ker*_* SB 70

我认为答案是15.4/14(例外规范):

继承构造函数(12.9)和隐式声明的特殊成员函数(子句12)具有异常规范.如果f是继承构造函数或隐式声明的默认构造函数,复制构造函数,移动构造函数,析构函数,复制赋值运算符或移动赋值运算符,则其隐式异常规范指定type-id Tif且仅当if 例外T允许时 由隐式定义直接调用的函数; 如果它直接调用的任何函数允许所有异常,则允许所有异常,并具有异常规范fff noexcept(true) 如果它直接调用的每个函数都不允许例外.

基本上,它是你的想法,隐式声明的移动构造函数就是noexcept它.

  • 附加信息:您可以测试您的期望是否得到满足:`static_assert(std :: is_nothrow_move_constructible <MyType> :: value,"MyType应该是noExcept MoveConstructible"); (45认同)
  • 用`default`显式声明特殊成员函数怎么样?例如`void T(T &&)= default`.如果这个移动构造函数是否被其他条件(例如用户定义的复制构造函数)阻止而隐式声明,我是否正确地假设它的行为完全相同? (7认同)
  • @mucaho:好吧,如果您所有的成员本身都只使用隐式定义的特殊成员,那么这并不那么复杂。简单的规则是单一职责的规则,默认情况下,您应该注意的唯一人为错误是显式定义特殊成员函数。这只剩下需要审核的特殊用途的类(例如“ unique_ptr”)。 (2认同)
  • @YanZhou是的,显式默认的Special成员函数也遵循这些规则,除非为`constexpr`和`noexcept`显式覆盖。您的示例中有一个虚假的“ void”,因此它是一个编译错误。 (2认同)