gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 15:20:22 26 4
gpt4 key购买 nike

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

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 是否隐式用于内联方法?

最佳答案

对不起,没有。唯一隐含的异常规范是

  • 关于析构函数。
  • 关于其他隐式声明或显式默认的特殊成员函数:默认构造函数、复制和移动构造函数以及复制和移动赋值,当未在类定义中声明或使用 = 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com