提问人:Eternal 提问时间:5/17/2023 最后编辑:Eternal 更新时间:5/17/2023 访问量:93
标准库函数何时会引发异常?
When can the standard library functions throw exceptions?
问:
我很难理解标准库中的哪些函数会引发异常,如果是这样,哪些函数以及何时抛出异常。
有些函数是 ,在这种情况下,它们不会,但是如果我例如查看: https://en.cppreference.com/w/cpp/string/basic_string/operator_at,运算符还没有 页面没有说明异常(这里也一样,所以它应该与模板无关)。noexcept
std::string::operator[]()
noexcept
std::basic_string
我是否可以假设如果页面上没有列出异常,则意味着该函数无法抛出(但由于某种原因未标记为)?或者这是否意味着该函数可以抛出实现定义的异常?当列出例外时,它们是唯一可以抛出的吗?noexcept
编辑:
有人说我应该参考实际标准而不是 cppreference 来回答我的问题,并好心地为我提供了一个相关链接。
在我的示例中,相关页面将是这个:https://eel.is/c++draft/string.access,它明确声明
Throws: Nothing
operator[]()
话虽如此,下面的几行是 ,它没有也没有条目,所以我的问题仍然存在
front()
noexcept
Throws
答:
有时你必须在字里行间阅读。
该字符串有一个前提条件,即索引必须有效。cppreference 说道:operator[]
如果 pos > size(),则行为未定义。
未定义的行为包括引发异常。事实上,某些实现会在调试模式下引发超出范围的异常。
数学函数,如 ,最初来自 C 库。尽管 C 库没有抛出异常,但它也没有说任何函数,因此 C++ 也不兼容。std::abs
noexcept
评论
noexcept
Throws: Nothing
new
Throws: Nothing
new
new
Throws: Nothing
评论
std::strlen
绝对不应该抛出异常,至少,如果使用 C 标准库的实现,但它没有说明符,因为 C 没有例外。这意味着至少在某些情况下缺少说明符,并且函数无法引发异常。noexcept
noexcept
std::abs
noexcept
noexcept
noexcept
std::terminate
noexcept
throw
std::terminate
std::basic_string::operator[]()
如果其参数 (index) 超出范围,则具有未定义的行为 - 这既不禁止也不需要抛出异常。事实上,在标准库的某些实现的某些调试版本中,它确实抛出了 - 这是一种允许的行为,但如果是,则隐式不允许。相比之下,如果其参数(索引)超出边界,则会进行边界检查并引发异常,因此可以避免未定义的行为,但必须进行边界检查。其他标准容器的操作类似。noexcept
std::basic_string::at()