在这种情况下,我们应该使用noexcept吗?

时间:2016-02-25 15:45:43

标签: c++11 error-handling error-code noexcept

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

2 个答案:

答案 0 :(得分:4)

我认为它可能对您的设置有用。原因是标准库容器和算法可以使用某些操作的更优化实现,如果这些操作是noexcept()

答案 1 :(得分:4)

1。)我不认为在非特殊成员函数的函数上进行它是值得的。特殊成员函数是唯一可以通过noexcept声明在标准库中看到性能提升的地方。 (也可能swap?)

2。)你可以同时使用默认声明和noexcept,而不应该写出默认的内容!在像

这样的声明中

my_class(const my_class&) noexcept = default;

这将导致编译器生成默认复制ctor并为其提供noexcept声明,即使默认复制ctor被强制调用未标记为noexcept的函数也是如此。    在许多情况下,编译器生成的特殊成员函数是正确的noexcept - 只要它们不调用noexcept(false)的东西。因此,如果以这种方式标记大多数低级别的课程,您甚至可能不需要标记那么多功能,以获得大部分好处。

一个例子是,在C++11中,std::string移动ctor未声明为noexcept,即使应该。在C ++ 14之前,标准不要求它。我认为这只是一种疏忽 - 我不知道std::string移动ctor实际投掷的任何实现,我也无法想象为什么会这样。

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

3。)noexcept也有价值,因为它有助于记录代码。例如,如果你正在创建一个库,我会考虑在适用的时候在API函数上添加noexcept,你不认为你会在以后抛出它。但是,对于仅仅是内部实现细节而不是特殊成员函数的函数来说,将no除外,不太可能增加那么多的值,即使它不会受到伤害。