调用std::terminate是否违反函数的noexcept声明约定?
int my_fun(int i) noexcept { if(i==0) std::terminate(); return 3/i; }
结论
你完全可以将该函数声明为noexcept,你的现有认知是正确的。
原因说明
noexcept的语义仅约束函数不会向外抛出任何C++异常,和函数是否会主动终止程序运行没有关联。std::terminate是标准库提供的直接终止程序的函数,不属于异常抛出的范畴,主动调用它完全不违反noexcept的约定。- 代码中
i为0时的整数除0操作属于C标准规定的未定义行为,本身不会触发C异常,也不会违反noexcept的要求。 - 常见的认知误区是把
noexcept理解为“函数不会异常终止”,实际上它只限制异常抛出这一种场景。你在noexcept函数里调用abort()、_exit()、std::terminate()这类直接终止程序的函数,都完全符合语法和语义要求。
补充:如果一个声明了
noexcept的函数实际向外抛出了异常,C++标准会强制触发std::terminate调用终止程序,这和你代码中主动调用std::terminate是完全不同的两个逻辑。
内容的提问来源于stack exchange,提问作者Joe Todd
相关产品推荐
相关产品推荐

