"你不应该扔掉#34;并且没有

时间:2014-12-27 19:39:19

标签: c++ exception c++11 language-lawyer

C ++标准有时使用短语"不应抛出异常",例如在枚举Hash要求时在17.6.3.4中。这是否意味着符合标准的实现必须std::hash的调用运算符标记为noexcept,或者这是否意味着从散列函数中抛出会导致未定义或实现 - 定义的行为?

我检查了libstdc ++和libc ++都将std::hash调用运算符标记为noexcept,但我想了解这是否是必需行为。

1 个答案:

答案 0 :(得分:19)

要求:你不能扔”意味着你猜对了:如果你扔了,你会得到不明确的行为。

此外,17.6.5.12 [res.on.exception.handling] / p1允许实现者添加 noexcept-specfication

  

C ++标准库中定义的任何函数都可以报告   通过抛出其抛出中描述的类型的异常来失败:   段。实施可以加强例外   通过添加非投掷来指定非虚函数   noexcept规格。

libstdc ++和libc ++将std::hash的调用操作符标记为noexcept作为符合扩展名。他们被允许,但不是必须这样做。