问题标题说明了一切。我需要知道编译器隐式实现的default
复制/移动赋值/ ctors是否被声明为noexcept
。
答案 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。