为何std::free()未被声明为noexcept?
为什么
std::free()未被声明为noexcept? - C语言本身不支持异常机制,因此C标准库的
free()函数不会抛出异常;std::free()作为C对该函数的封装,行为与C版本完全一致,也不会抛出任何C异常。
那为何不给它加上noexcept修饰?核心原因是历史兼容性考量:
noexcept是C11才引入的特性,而std::free()在C标准中的存在时间远早于C++11。为了确保旧代码在新标准下的兼容性,标准委员会不会随意为已有函数追加noexcept修饰,除非能100%确定不会破坏现有代码的行为。- 在
noexcept出现前的C++标准中,并没有强制要求std::free()必须不抛出异常(当时也没有对应的语法来声明这一点)。后续标准修订时,出于对既有代码行为预期的尊重,没有额外添加这个修饰。 - 虽然
std::free()传入无效参数会触发未定义行为,但未定义行为的范畴并不包含抛出C++异常——这一点本不影响noexcept的声明,但标准制定的保守性让委员会选择维持现状。
总结来说,std::free()未被声明为noexcept,本质是历史包袱和兼容性优先原则的结果,尽管它实际上不会抛出任何异常。
内容的提问来源于stack exchange,提问作者einpoklum
相关产品推荐
相关产品推荐

