我正在开发一个使用错误代码的项目,并且不允许异常处理(我们使用的是new
运算符的nothrowing版本)。
在每个函数上使用noexcept
说明符是否有意义?
哪些是可能的利弊?
答案 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除外,不太可能增加那么多的值,即使它不会受到伤害。