c++ 什么时候标准库函数可以抛出异常?

qvtsj1bj  于 2023-05-20  发布在  其他
关注(0)|答案(1)|浏览(181)

我很难理解标准库中的哪些函数可以抛出异常,如果可以,是哪一个以及何时抛出。
有些函数是noexcept,在这种情况下,它们没有,但是如果我在std::string::operator[]()中查找:https://en.cppreference.com/w/cpp/string/basic_string/operator_at,操作符不是noexcept,但页面没有说明异常(和相同的here,所以它应该与std::basic_string是模板无关)。
我可以假设如果页面上没有列出异常,那么这意味着函数不能抛出(但由于某种原因没有标记为noexcept)吗?或者它意味着函数可以抛出实现定义的异常?当列出异常时,它们是唯一可以抛出的异常吗?
编辑:

  • 有人说我的问题应该参考实际的标准,而不是cpreference,并好心地给了我一个相关的链接。
  • 在我的例子中,相关的页面是这样的:https://eel.is/c++draft/string.access,明确声明Throws: Nothingoperator[]()
  • 话虽如此,下面的几行代码是front(),它不是noexcept,并且在其描述中没有Throws条目,所以我的问题仍然成立
9njqaruj

9njqaruj1#

有时候你得从字里行间去体会。
字符串operator[]有一个 * 前提条件 *,即索引必须有效。cppreference说:
如果pos > size(),则行为未定义。
未定义的行为包括引发异常。事实上,有些实现会在调试模式下抛出超出范围的异常。
数学函数,如std::abs,最初来自C库。尽管C库不会抛出异常,但它也不会为任何函数指定noexcept,因此为了兼容,C++也不会。

相关问题