C ++标准有时使用短语"不应抛出异常",例如在枚举Hash
要求时在17.6.3.4中。这是否意味着符合标准的实现必须将std::hash
的调用运算符标记为noexcept
,或者这是否意味着从散列函数中抛出会导致未定义或实现 - 定义的行为?
我检查了libstdc ++和libc ++都将std::hash
调用运算符标记为noexcept
,但我想了解这是否是必需行为。
答案 0 :(得分:19)
“要求:你不能扔”意味着你猜对了:如果你扔了,你会得到不明确的行为。
此外,17.6.5.12 [res.on.exception.handling] / p1允许实现者添加 noexcept-specfication :
C ++标准库中定义的任何函数都可以报告 通过抛出其抛出中描述的类型的异常来失败: 段。实施可以加强例外 通过添加非投掷来指定非虚函数 noexcept规格。
libstdc ++和libc ++将std::hash
的调用操作符标记为noexcept
作为符合扩展名。他们被允许,但不是必须这样做。