我很难理解标准库中的哪些函数可以抛出异常,如果可以,是哪一个以及何时抛出。
有些函数是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: Nothing
为operator[]()
- 话虽如此,下面的几行代码是
front()
,它不是noexcept
,并且在其描述中没有Throws
条目,所以我的问题仍然成立
1条答案
按热度按时间9njqaruj1#
有时候你得从字里行间去体会。
字符串
operator[]
有一个 * 前提条件 *,即索引必须有效。cppreference说:如果pos > size(),则行为未定义。
未定义的行为包括引发异常。事实上,有些实现会在调试模式下抛出超出范围的异常。
数学函数,如
std::abs
,最初来自C库。尽管C库不会抛出异常,但它也不会为任何函数指定noexcept
,因此为了兼容,C++也不会。