81

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

隐式声明的移动构造函数

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

4

1 回答 1

86

我认为答案是 15.4/14(异常规范):

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

基本上,它会如你所想,并且隐式声明的移动构造函数是noexcept尽可能的。

于 2013-09-06T09:12:02.873 回答