为什么这两个std::stringfind()函数被声明为noexcept?

根据[string.find#1.2]和[string.find#1.3]:

表单的每个成员函数

  • constexpr size_type F(const charT* s, size_type pos) const;

具有等效于: return F(basic_­string_­view<charT, traits>(s), pos);

表单的每个成员函数

  • constexpr size_type F(const charT* s, size_type pos, size_type n) const;

具有等效于: return F(basic_­string_­view<charT, traits>(s, n), pos);

这两个find功能都没有的声明noexcept,但所有三个编译器厂商没有按照规则,他们只是执行它noexcept

这背后的原因是什么?

回答

这就是所谓的拉科斯规则。见N3248。规则是如果一个函数有一个前提条件,它不应该被标记,noexcept因为它会阻止实现检查前提条件并在验证时抛出异常,如果实现会选择这样做的话。

在这种情况下,find(s, pos, n)相当于find(string_view(s, n), pos)。并且该string_view(s, n)构造有一个前提条件,s即长度至少为 的有效字符串n。所以一个实现可以尝试以某种方式验证它并在失败时抛出异常。

但是没有一个实现实际上尝试验证这一点,因此它们不会自由地可能抛出前提条件违规,而是简单地将这些函数标记为noexcept. 他们被允许从[res.on.exception.handling]做:

实现可以通过添加非抛出异常规范来加强非虚拟函数的异常规范。


Library Evolution 最近接受了P1656,它基本上恢复了Lakos规则。


以上是为什么这两个std::stringfind()函数被声明为noexcept?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>