当C11对使用noexcept限定词声明的其他函数进行调用时,C 11是否提供内联函数或方法的任何保证?
class My_String { ...
const char * c_str () const noexcept;
inline operator const char * () const { return c_str(); }
};
我假设优化编译器可以自由地实现没有完整的EH和堆栈展开的内联方法,根据noexcept限定条件.我也会期待一个简单的访问器方法:
... inline operator const char * () const { return m_buffer; }
虽然这个例子看起来微不足道,但是当用于实现其他类或函数时,异常保证很重要.问:C11标准是否将这个或内联方法标记为noexcept?或者更好地省略noexcept,除非匹配类或功能规范?
编辑:避免一些混乱:内联方法是否隐含?
解决方法
抱歉,没有.唯一的隐式异常规范是
>关于析构函数
>在其他隐式声明或明确默认的特殊成员函数:默认构造函数,复制和移动构造函数,以及复制和移动赋值,如果未在类定义中声明,或声明为= default;
>取消分配功能:运算符删除和运算符删除[].
因此,使用任一示例声明,noexcept(static_cast< const char *>(std :: declval< const MyString>()))必须为false.继续写下noexcept可能会重要的地方.
当然,正如你所说,编译器优化仍然允许注意到内联函数不能抛出异常并简化调用者中的异常处理.