代码之家  ›  专栏  ›  技术社区  ›  a06e

隐式移动ctor/assignet操作是否不例外?隐式复制操作呢?

  •  1
  • a06e  · 技术社区  · 9 年前

    问题标题说明了一切。我需要知道 default 声明由编译器隐式实现的复制/移动赋值/构造函数 noexcept .

    2 回复  |  直到 9 年前
        1
  •  4
  •   Jonathan Wakely    9 年前

    标准规定:

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

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

        2
  •  4
  •   Jonathan Wakely    9 年前

    显然,它们不能只是无条件的noexcept,这既愚蠢又错误(例如,包含 std::string 成员可能需要分配内存,因此它不可能是noexcept)。

    如果它们只调用非except的函数,那么它们就不是except;如果它们调用任何非except的函数,它们就不是noexcept。