C++省略了"noexcept"说明符与"noexception(false)"
C++ omitting `noexcept` specifier versus `noexcept(false)`, what is their precise meaning?
如果我将函数标记为noexcept(false)
,或任何其他计算结果为false的表达式,这意味着什么?(1) 我是否向编译器确保函数可以抛出异常?,(2) 或者我是在确保它是否可以抛出异常?
最后,如果我省略了noexcept
说明符,它等同于noexcept(false)
,或者只等同于上面所说的第(2)个含义?
通过指定noexcept(true)
,您可以声明函数从不抛出异常。通过指定noexcept(false)
,或者不指定任何内容,就不会声称函数从不抛出异常。
因此,它基本上是您的语句(2),但请注意,对于编译器来说,这相当于您的声明(1)。如果编译器不能保证函数不会抛出,那么它必须假设它可以抛出。
该标准的相关位是C++115.4/12:
一个没有异常规范或有例外规范
noexcept(constant-expression)
形式的函数,其中常量表达式产生false
允许所有异常。异常规范是非抛出,如果其形式为throw()
、noexcept
或noexcept(constant-expression)
,其中常量表达式产生true
。具有非抛出异常规范的函数不允许任何异常。
与该规则只有两个偏差。一种是析构函数—在析构函数上不设置异常规范,将为析构函数提供与默认生成的析构函数相同的异常规范。也就是说,noexcept(true)
当且仅当从默认生成的析构函数直接调用的所有函数都是noexcept(true)
。
另一个是解除分配函数(operator delete
)—没有明确异常规范的解除分配函数被视为CCD_ 15。
除了析构函数之外,省略noexcept
说明符等效于noexcept(false)
,,其中省略说明符意味着让编译器从成员和基类中推导。
- 'char (*RtlpNumberOf(T (&)[N]))[N]':无法从"char *"
- Arduino IDE 错误 - 无法找到数字文字运算符"运算符""f900ff"
- "inline"、"constexpr"或"noexcept"
- "非静态数据成员之前需要构造函数" - 我是否使用"boost::variant"
- 我必须安装"libbitcoin-server"才能包含"bitcoin.hpp"
- “并非所有控制路径都返回一个值./&quot“控制可能达到非空隙功能的末端”.验证时循环时
- 如何输出a'&quot在不使用线端的情况下进行文件
- 删除“按任何键” ..&quot.从VS C 控制台应用程序
- 如何检测我何时向可变参数函数传递"std::string"而不是"c_str()"
- '<'''<'''&quot的模板类错误''令牌”
- C++省略了"noexcept"说明符与"noexception(false)"
- 错误消息:"jj"的名称查找已更改为ISO"for"范围,(如果您使用"