2016-02-25 147 views
3

我正在处理使用错误代码的项目,并且不允许执行异常处理(我们正在使用new运算符的nothrowing版本)。 是否有意义使用说明符每个函数? 哪些是可能的赞成和反对?在这种情况下我们应该使用noexcept吗?

+1

我没有看到任何好处。如果一切都“相同”,那么没有必要明确标记该属性。 – knivil

回答

3

我认为它可以在您的设置中很有用。原因是如果这些操作是noexcept(),标准库容器和算法可以使用某些操作的更优化实现。

+0

但是那些优化值得付出努力吗?我相信所有默认的构造函数和赋值运算符都不是'noexcept',因此必须手动定义......所有这些... – nyarlathotep108

+1

@ nyarlathotep108 - 我选择为具有相似要求的特定项目执行此操作。我相信你将在未来看到C++语言的变化,这将使这更容易。 – Jeff

+0

@Jeff你的意思是在C++ 17中吗?还是进一步? – nyarlathotep108

3

1.)我不认为这是值得的做它不是特殊成员函数的函数。特殊成员函数是唯一可以从noexcept声明afaik中看到标准库中性能增益的地方。 (可能swap也?)

2)您可以使用默认的声明和noexcept在同一时间,你应该,而不是写出来的东西会被默认!在像

my_class(const my_class&) noexcept = default;

声明这将导致编译器生成一个默认的拷贝构造函数,并给它一个noexcept声明,即使默认构造函数复制强制调用未标记noexcept的功能。 在很多情况下,只要编译器生成的特殊成员函数没有调用noexcept(false)的东西,它就是noexcept。因此,如果你用这种方式标记大多数低级别类,你甚至可能不需要标记那么多功能,以获得大部分好处。

一个例子是,在C++11std::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,并且你不认为你会在稍后抛出。但是,对仅仅是内部实现细节而不是特殊成员函数的函数不加以注意,不可能增加那么多价值,尽管它不会受到伤害。

相关问题