我正在处理使用错误代码的项目,并且不允许执行异常处理(我们正在使用new
运算符的nothrowing版本)。 是否有意义使用说明符每个函数? 哪些是可能的赞成和反对?在这种情况下我们应该使用noexcept吗?
回答
我认为它可以在您的设置中很有用。原因是如果这些操作是noexcept()
,标准库容器和算法可以使用某些操作的更优化实现。
但是那些优化值得付出努力吗?我相信所有默认的构造函数和赋值运算符都不是'noexcept',因此必须手动定义......所有这些... – nyarlathotep108
@ nyarlathotep108 - 我选择为具有相似要求的特定项目执行此操作。我相信你将在未来看到C++语言的变化,这将使这更容易。 – Jeff
@Jeff你的意思是在C++ 17中吗?还是进一步? – nyarlathotep108
1.)我不认为这是值得的做它不是特殊成员函数的函数。特殊成员函数是唯一可以从noexcept
声明afaik中看到标准库中性能增益的地方。 (可能swap
也?)
2)您可以使用默认的声明和noexcept
在同一时间,你应该,而不是写出来的东西会被默认!在像
my_class(const my_class&) noexcept = default;
声明这将导致编译器生成一个默认的拷贝构造函数,并给它一个noexcept声明,即使默认构造函数复制强制调用未标记noexcept的功能。 在很多情况下,只要编译器生成的特殊成员函数没有调用noexcept(false)
的东西,它就是noexcept。因此,如果你用这种方式标记大多数低级别类,你甚至可能不需要标记那么多功能,以获得大部分好处。
一个例子是,在C++11
,std::string
移动构造函数未声明noexcept
,即使它应该。直到C++ 14之前,它不是标准所要求的。我相信这只是一个疏忽 - 我不知道有什么实施方案,其中std::string
移动ctor实际上是投掷,我也不能想象为什么它会。
但是,因此,包含std::string
成员的类的默认移动构造函数不会获取noexcept
规范,因为它们被强制调用可能抛出的函数。因此,包含std::string
数据成员的类通常是在C++ 11,IMO中使用my_class(my_class &&) noexcept = default
的好地方。
3.)noexcept
也有价值,因为它有助于记录代码。例如,如果你正在创建一个库,我会考虑在适用的时候对API函数进行noexcept,并且你不认为你会在稍后抛出。但是,对仅仅是内部实现细节而不是特殊成员函数的函数不加以注意,不可能增加那么多价值,尽管它不会受到伤害。
- 1. 在这种情况下,我应该使用Wordpress Transient API吗?
- 2. Java:我应该在这种情况下使用多线程吗?
- 3. 我应该在这种情况下使用新的吗?
- 4. 我应该在这种情况下使用Gzip吗?
- 5. 我应该在这种情况下使用Polymorphic关联吗?
- 6. 我应该在这种情况下使用嵌套类吗?
- 7. 我应该在这种情况下使用XML吗?
- 8. 在这种情况下,我应该使用指针向量吗?
- 9. 我应该在这种情况下使用合并吗?
- 10. 在这种情况下我应该使用继承吗?
- 11. 我应该在这种情况下使用宏吗?或...
- 12. 在这种情况下,我应该使用reduceLeft方法吗?
- 13. 在这种情况下我应该使用例外吗?
- 14. 我应该使用哪种布局在这种情况下?
- 15. 我应该在这种情况下使用哪种SQL查询
- 16. 应该在这种情况下使用TcpClient吗?
- 17. 在这种情况下,我应该重新抛出异常吗?
- 18. 我应该在这种情况下进行规范化吗?
- 19. 我应该在这种情况下真的做出子类吗?
- 20. 我应该在这种情况下制作ImageHelper吗?
- 21. 在这种情况下我应该真的实施IDisposable吗?
- 22. 在这种情况下,我应该担心释放资源吗?
- 23. 在这种情况下,我应该使用应用内购买吗?
- 24. 我应该在这种情况下使用聚合?
- 25. 在这种情况下我应该如何使用Google API?
- 26. 我应该如何使用git在这种情况下
- 27. 在这种情况下,我应该使用java输入函数?
- 28. 我应该使用分区,在这种情况下
- 29. 我应该使用Azure在这种情况下
- 30. 在这种情况下,我应该如何使用getter方法?
我没有看到任何好处。如果一切都“相同”,那么没有必要明确标记该属性。 – knivil