C++标准库函数何时抛出异常?相关规则疑问
C++标准库函数异常行为的判定指南
基础规则
- 带
noexcept标注的函数:绝对不会抛出C异常,标准强制实现必须保证这一点(硬件级错误如段错误不属于C异常体系,不在此讨论范围内)。 - 标准明确标注
Throws: Nothing的函数:和noexcept函数完全等价,只是因为C++11才引入noexcept关键字,部分旧标准函数没补加标注,这类函数也不会抛出任何异常。 - 标准无
Throws条目且未标noexcept的函数:- 按照C++标准的隐含规则,这类函数默认是无抛出的——不会抛出任何标准库定义的异常,也不允许实现抛出自定义的实现级异常。
- 比如你提到的
std::string::front(),它的行为逻辑等价于operator[](0),而后者标准明确写了Throws: Nothing,所以front()必然也是无抛出的,只是标准文档编写时的惯例没加Throws说明。
- 标准列出具体异常的函数:只会抛出文档中明确指定的异常(以及这些异常的派生类),不会出现未声明的额外异常。
cppreference与标准文档的优先级
cppreference是社区维护的参考资料,可能存在细节遗漏,所以判定函数异常行为时,C++标准文档的优先级高于cppreference。比如std::string::operator[],cppreference没提及异常,但标准明确标注Throws: Nothing,此时以标准为准。
关键结论
- 不要只看
noexcept标注,优先查标准的Throws说明。 - 标准未写
Throws也没标noexcept的函数,默认无抛出,无需担心异常问题。 - 标准列出的异常是函数可能抛出的全部类型,不会有超出范围的情况。
内容的提问来源于stack exchange,提问作者Eternal
相关产品推荐
相关产品推荐

