何时应该将noexcept
属性添加到函数中?也就是说,编译器什么时候不能告诉函数抛出?所有的东西都应该被标记,还是有什么方法可以分辨?
我不喜欢过早的优化,也不喜欢过早的归因。我不知道如何“分析”noexcept
的需求,就像我在优化时分析性能一样。
在评估必要的地方时,请评论最常见的编译器,如MSVC、GCC等。
发布于 2020-09-04 03:45:57
C++核心指南建议在代码不抛出的任何地方使用它。这对于库来说非常重要,因为代码检查程序使用您调用的函数来查看它是否是noexcept
,否则就会得到一连串的警告。
尽管如此,最重要的建议是让swap
、move
和析构函数noexcept
。
C++核心指南还建议将默认构造函数设置为noexcept
,这在一般情况下是很棒的,但是许多模式(如pImpl成语)通常在其默认构造函数中分配内存。因此,我通常在默认构造函数(或只接受默认参数的构造函数)上使用noexcept
,但是如果我知道它可以抛出,我就需要显式地标记它为nothrow(false)
。
如果将默认构造函数、复制构造函数、赋值操作符、移动构造函数、移动运算符或析构函数声明为
=default
,则为隐式noexcept
。所有析构函数也都是隐式noexcept
。有一种观点认为,您可以将noexcept
标记为“如果确实抛出,就继续崩溃”。我觉得这个概念有点模糊,所以在我的代码中,我标记了可以抛出noexcept(false)
或不指定它的东西。这通常是调用new
或初始化std
容器的内容。
发布于 2020-09-03 17:00:19
何时应该将
noexcept
属性添加到函数中?
每当您想记录和强制执行函数时,都不会抛出。
重要的是要记住,这里的错误意味着将调用std::terminate()
,而不是传播异常。因此,这可能是一种悲观。
也就是说,编译器什么时候不能告诉函数抛出?
相反:编译器必须假设所有的东西都抛出,除非它可以证明不是(或者被告知不是)。
当它有了所需的定义时,它将能够证明它。例如,在没有LTO的TUs之间,它不会。
我不知道如何“分析”
noexcept
的需求
就像在任何其他情况下一样:你用和不测量。
对于大多数项目来说,支持LTO是处理LTO的更好方法。
https://stackoverflow.com/questions/63727975
复制相似问题