在这种情况下,我们应该在所有地方都使用 noexcept 吗?

Shall we use noexcept everywhere in this case?

我正在处理一个使用错误代码的项目,并且不允许异常处理(我们使用的是 new 运算符的 nothrowing 版本)。 在 every 函数上使用 noexcept 说明符有意义吗? 可能的利弊是什么?

我认为它对您的设置很有用。原因是如果这些操作是 noexcept().

,标准库容器和算法可以使用某些操作的更优化实现

1.) 我认为不值得在不是特殊成员函数的函数上这样做。特殊成员函数是您在标准库中从 noexcept 声明中看到性能提升的唯一地方,afaik。 (可能还有swap?)

2.) 您可以同时使用默认声明和noexcept,您应该而不是写出默认声明!在像

这样的声明中

my_class(const my_class&) noexcept = default;

这将导致编译器生成一个默认的复制构造函数并给它一个 noexcept 声明,即使默认的复制构造函数被强制调用一个没有标记为 noexcept 的函数。 在许多情况下,编译器生成的特殊成员函数是正确的 noexcept —— 只要它们不调用 noexcept(false) 的东西。因此,如果您以这种方式标记大部分低级 类,您甚至可能不必标记那么多功能,以获得大部分好处。

一个例子是,在 C++11 中,std::string 移动构造函数没有被声明 noexcept,尽管它 应该是 。直到 C++14,标准才要求它。我相信这只是一个疏忽——我不知道 std::string move ctor 实际抛出的任何实现,我也无法想象它为什么会抛出。

但结果是,包含 std::string 成员的 类 的默认移动构造函数不获取 noexcept 规范,因为它们被迫调用可能抛出的函数。因此,包含 std::string 数据成员的 类 通常是在 C++11 和 IMO 中使用 my_class(my_class &&) noexcept = default 的好地方。

3.) noexcept 也很有价值,因为它有助于记录代码。例如,如果你正在制作一个库,我会考虑在适用时将 noexcept 放在 API 函数上,你认为你不会让它在以后抛出。但是将 noexcept 放在只是内部实现细节而不是特殊成员函数的函数上,不太可能增加那么多价值,imo,尽管它不会造成伤害。