问题标题说明了一切。我需要知道是否default
声明了编译器隐式实现的复制/移动分配/ctors noexcept
。
问问题
67 次
2 回答
4
标准说:
继承构造函数 (12.9) 和隐式声明的特殊成员函数 (Clause 12) 具有异常规范。如果 f 是继承构造函数或隐式声明的默认构造函数、复制构造函数、移动构造函数、析构函数、复制赋值运算符或移动赋值运算符,则其隐式异常规范指定类型 ID T 当且仅当 T 被由 f 的隐式定义直接调用的函数的异常规范;如果 f 直接调用的任何函数都允许所有异常,则 f 允许所有异常,如果 f 直接调用的每个函数都不允许异常,则 f 具有异常规范 noexcept(true)。
因此,如果您的类的隐式声明的复制/移动分配/ctors 不需要调用任何标记为 noexcept(false) 的东西,那么它们将具有 noexcept(true) 说明符。需要调用的函数将是基类和非静态数据成员的复制/移动分配/ctors。
于 2015-08-16T22:01:27.813 回答
4
显然,它们不能只是无条件地为 noexcept,这既愚蠢又错误(例如,包含std::string
成员的类的隐式复制构造函数可能需要分配内存,因此它不能明智地是 noexcept)。
如果它们只调用 noexcept 的函数,它们就是 noexcept,如果它们调用任何不是 noexcept 的函数,它们就不是 noexcept。
于 2015-08-16T22:10:06.453 回答