为什么C++中没有预定义的零除异常?

问题描述 投票:0回答:1

ISO C++
标准(我使用的是 ISO C++17)中有详细记录,整数除以 0 结果是未定义的。这也可以从
<stdexcept>
标头中可用的预定义异常列表中排除零除异常看出:

namespace std {
    class logic_error;
        class domain_error;
        class invalid_argument;
        class length_error;
        class out_of_range;
    class runtime_error;
        class range_error;
        class overflow_error;
        class underflow_error;
}

虽然我知道被调用函数只能检查除数是否为 0 并抛出

domain_error
overflow_error
,但我想知道没有预定义零除异常的可能原因是什么。

c++ c++17
1个回答
2
投票

(几乎)没有任何核心语言结构会抛出异常(当然除了

throw
)。该规则的唯一例外是
new
,它可能抛出
std::bad_array_new_length
dynamic_cast
,它明确具有抛出和非抛出形式,以及
typeid
,它可能抛出
std​::​bad_typeid

抛出异常是一项成本高昂的操作,而首先使用 C++ 的主要原因之一是性能。强制程序在每次除法时都进行空值检查然后抛出异常是没有意义的。如果有人想要,他们可以将其包装在自己的函数中以代替内置的除法运算符。

在上面列出的异常中,操作本身的成本就已经很高,因此抛出异常是可以接受的。

核心语言必须尽可能具有性能。如果需要的话,其他一切都可以在库函数中完成。

© www.soinside.com 2019 - 2024. All rights reserved.