隐含的移动ctor / assignmet操作是否有效?隐式复制操作怎么样?

时间:2015-08-16 21:44:36

标签: c++11 move noexcept

问题标题说明了一切。我需要知道编译器隐式实现的default复制/移动赋值/ ctors是否被声明为noexcept

2 个答案:

答案 0 :(得分:4)

标准说:

  

继承构造函数(12.9)和隐式声明的特殊   成员函数(第12条)具有异常规范。如果f是   继承构造函数或隐式声明的默认值   构造函数,复制构造函数,移动构造函数,析构函数,副本   赋值运算符,或移动赋值运算符,其隐式   exception-specification指定type-id T当且仅当T为时   直接调用的函数的异常规范允许   通过f的隐含定义;如果有任何功能,f允许所有异常   直接调用允许所有异常,而f具有   异常规范noexcept(true)如果每个函数都是直接的   invokes不允许例外。

因此,如果你的类的隐式声明的复制/移动赋值/ ctors不需要调用任何标记为noexcept(false)的东西,那么它们将具有noexcept(true)说明符。需要调用的函数将是基类和非静态数据成员的复制/移动赋值/控制。

答案 1 :(得分:4)

显然,它们不能只是无条件noexcept,这既愚蠢又错误(例如,包含std::string成员的类的隐式复制构造函数可能需要分配内存,因此它不能明智地是noexcept)。

如果他们只调用noexcept函数,那么他们就没有了,如果他们调用任何不是noexcept的函数,它们就不是noexcept。