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
吗?
答案 0 :(得分:9)
抱歉,没有。唯一隐含的异常规范是
= default;
声明。operator delete
和operator delete[]
。 [请注意,对于解除分配函数,隐式异常规范始终如同noexcept(true)
。对于所有析构函数以及在第一个声明中隐式声明或显式默认的特殊成员函数,隐式异常规范可以是noexcept(true)
或noexcept(false)
,这是根据异常规范确定的。任何基类和类类成员的相应特殊成员函数。]
因此,对于任何一个示例声明,noexcept(static_cast<const char*>(std::declval<const MyString>()))
必须为false
。继续写下noexcept
可能很重要的地方。
当然,正如您所指出的,仍然允许编译器优化注意到内联函数不能抛出异常并简化调用者中的异常处理。