12

inline当 C++11调用使用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 标准是否解决了这个问题,还是应该标记内联方法noexceptnoexcept或者除非需要匹配类或函数规范,否则最好省略?

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

4

1 回答 1

9

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

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

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

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

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

于 2012-08-15T12:30:29.307 回答