C++11 在这种情况下,我们应该在任何地方使用noexcept吗?

C++11 在这种情况下,我们应该在任何地方使用noexcept吗?,c++11,error-handling,error-code,noexcept,C++11,Error Handling,Error Code,Noexcept,我正在处理一个使用错误代码的项目,不允许进行异常处理(我们使用的是new操作符的nothrowing版本)。 在每个函数上使用noexcept说明符有意义吗? 哪些是可能的优点和缺点?我认为它在您的设置中可能很有用。原因是,如果某些操作是noexcept()1),则标准库容器和算法可以使用某些操作的更优化的实现。我认为不值得在非特殊成员函数的函数上这样做。特殊成员函数是标准库中唯一可以从noexceptdeclaration,afaik中看到性能提升的地方。(也可能交换) 2.)您可以同时使用默

我正在处理一个使用错误代码的项目,不允许进行异常处理(我们使用的是
new
操作符的nothrowing版本)。 在每个函数上使用
noexcept
说明符有意义吗?
哪些是可能的优点和缺点?

我认为它在您的设置中可能很有用。原因是,如果某些操作是
noexcept()

1),则标准库容器和算法可以使用某些操作的更优化的实现。我认为不值得在非特殊成员函数的函数上这样做。特殊成员函数是标准库中唯一可以从
noexcept
declaration,afaik中看到性能提升的地方。(也可能
交换

2.)您可以同时使用默认声明和
noexcept
,您不应该写出默认的内容!在这样的声明中


my_class(const my_class&)noexcept=默认值;

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

例如,在
C++11
中,
std::string
move-ctor未声明
noexcept
,即使它应该声明。直到C++14,标准才要求它。我相信这只是一个疏忽——我不知道有任何
std::string
move-ctor实际抛出的实现,我也无法想象它为什么会抛出

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


3.
noexcept
也有价值,因为它有助于记录代码。例如,如果你正在制作一个库,我会考虑在API函数之外的任何时候应用它,并且你不会认为它会让它稍后抛出。但是,在只是内部实现细节而不是特殊成员函数的函数上添加“无例外”不太可能增加那么多价值,imo,尽管这不会有什么坏处。

我看不到任何好处。如果一切都是“相同”的,那么显式标记该属性就没有意义了。但是这些优化值得付出努力吗?我相信所有默认的构造函数和赋值运算符都不是“noexcept”,因此必须手动定义。。。所有这些…@nyarlathotep108-我选择为一个具有类似要求的特定项目这样做。我相信你会看到C++语言在未来的变化,这将使这更容易。@杰夫,你是指C++ 17吗?还是更进一步?