首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >什么时候才能显式地赋予one属性?

什么时候才能显式地赋予one属性?
EN

Stack Overflow用户
提问于 2020-09-03 16:31:17
回答 2查看 1K关注 0票数 4

何时应该将noexcept属性添加到函数中?也就是说,编译器什么时候不能告诉函数抛出?所有的东西都应该被标记,还是有什么方法可以分辨?

我不喜欢过早的优化,也不喜欢过早的归因。我不知道如何“分析”noexcept的需求,就像我在优化时分析性能一样。

在评估必要的地方时,请评论最常见的编译器,如MSVC、GCC等。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-09-04 03:45:57

C++核心指南建议在代码不抛出的任何地方使用它。这对于库来说非常重要,因为代码检查程序使用您调用的函数来查看它是否是noexcept,否则就会得到一连串的警告。

尽管如此,最重要的建议是让swapmove和析构函数noexcept

C++核心指南还建议将默认构造函数设置为noexcept,这在一般情况下是很棒的,但是许多模式(如pImpl成语)通常在其默认构造函数中分配内存。因此,我通常在默认构造函数(或只接受默认参数的构造函数)上使用noexcept,但是如果我知道它可以抛出,我就需要显式地标记它为nothrow(false)

如果将默认构造函数、复制构造函数、赋值操作符、移动构造函数、移动运算符或析构函数声明为=default,则为隐式noexcept。所有析构函数也都是隐式noexcept。有一种观点认为,您可以将noexcept标记为“如果确实抛出,就继续崩溃”。我觉得这个概念有点模糊,所以在我的代码中,我标记了可以抛出noexcept(false)或不指定它的东西。这通常是调用new或初始化std容器的内容。

票数 2
EN

Stack Overflow用户

发布于 2020-09-03 17:00:19

何时应该将noexcept属性添加到函数中?

每当您想记录和强制执行函数时,都不会抛出。

重要的是要记住,这里的错误意味着将调用std::terminate(),而不是传播异常。因此,这可能是一种悲观。

也就是说,编译器什么时候不能告诉函数抛出?

相反:编译器必须假设所有的东西都抛出,除非它可以证明不是(或者被告知不是)。

当它有了所需的定义时,它将能够证明它。例如,在没有LTO的TUs之间,它不会。

我不知道如何“分析”noexcept的需求

就像在任何其他情况下一样:你用和不测量。

对于大多数项目来说,支持LTO是处理LTO的更好方法。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63727975

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档