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

时间:2012-08-15 11:41:18

标签: c++ exception c++11 inline noexcept

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

class My_String { ...

    const char * c_str () const noexcept;
    inline operator const char * () const { return c_str(); }
};

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

... inline operator const char * () const { return m_buffer; }

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

修改:为避免一些混淆:内联方法隐含noexcept吗?

1 个答案:

答案 0 :(得分:9)

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

  • 关于析构函数。
  • 在其他隐式声明或显式默认的特殊成员函数上:默认构造函数,复制和移动构造函数,复制和移动赋值,未在类定义中声明或使用= default;声明。
  • 关于取消分配功能:operator deleteoperator delete[]

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

因此,对于任何一个示例声明,noexcept(static_cast<const char*>(std::declval<const MyString>()))必须为false。继续写下noexcept可能很重要的地方。

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