"你不应该扔掉",并且没有除外

blu*_*rni 17 c++ exception language-lawyer c++11

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

我检查了libstdc ++和libc ++标记std::hash的调用操作符noexcept,但我想知道这是否是必需的行为.

How*_*ant 19

" 要求:你不能扔掉"意味着你猜对了:如果你扔了,你会得到不确定的行为.

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

C++标准库中定义的任何函数都可以通过抛出其Throws:段落中描述的类型的异常来报告失败.实现可以通过添加非抛出noexcept规范来加强非虚函数的异常规范.

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