C++ 11 noexcept限定符和内联方法

Bre*_*ale 11 c++ inline exception noexcept c++11

当C++ 11 inline调用使用noexcept限定符声明的其他函数时,C++ 11是否对函数或方法提供任何保证?

class My_String { ...

    const char * c_str () const noexcept;
    inline operator const char * () const { return c_str(); }
};
Run Code Online (Sandbox Code Playgroud)

我假设优化编译器可以自由地实现内联方法,而没有完整的EH和堆栈展开,根据noexcept资格.我也希望这也是一个简单的访问方法:

... inline operator const char * () const { return m_buffer; }
Run Code Online (Sandbox Code Playgroud)

虽然这个例子看起来微不足道,但异常保证在用于实现其他类或函数时很重要.问: C++ 11标准是否解决了这个问题,还是应该标记内联方法noexcept?或者noexcept除非需要匹配类或函数规范,否则最好省略?

编辑:为避免一些混淆:noexcept内联方法是隐式的吗?

asc*_*ler 9

抱歉,没有.唯一隐含的异常规范是

  • 在析构函数上.
  • 在其他隐式声明或显式默认的特殊成员函数上:默认构造函数,复制和移动构造函数,复制和移动赋值,未在类定义中声明或声明时= default;.
  • 关于释放函数:operator deleteoperator delete[].

[注意,对于解除分配函数,隐式异常规范总是好像noexcept(true).对于所有析构函数以及在第一个声明中隐式声明或显式默认的特殊成员函数,隐式异常规范可以是noexcept(true)或者noexcept(false),根据任何基类和成员的相应特殊成员函数的异常规范确定类型.]

因此,无论是示例声明,都noexcept(static_cast<const char*>(std::declval<const MyString>()))必须如此false.继续写下noexcept可能重要的地方.

当然,正如您所指出的,仍然允许编译器优化注意到内联函数不能抛出异常并简化调用者中的异常处理.