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

编辑: 为避免混淆: 0x2518122231343141 是内联方法隐含的吗?

最佳答案

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

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

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

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

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

    关于C++11 noexcept 限定符和内联方法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11968645/

    10-17 01:40