移动构造函数是否必须是noexcept?

时间:2012-02-12 15:01:58

标签: c++ c++11 noexcept

我一直在阅读一些矛盾的文章,关于是否允许移动构造函数/赋值。

因此,我想问一下移动构造函数/赋值是否允许引入最终的C ++ 11标准?

2 个答案:

答案 0 :(得分:20)

移动构造函数一般是否允许抛出?是。 应该他们?否。

一般来说,你在其中所做的一切都不应该是任何可以抛出的东西。你不应该分配内存,调用其他代码或类似的东西。编写移动构造函数的唯一原因是与其他人的内存指针和对象引用一起潜逃。您应该复制一些基本类型并将其他对象中的值清空。那些东西不应该扔掉。

所以尽管这是允许的,但这不是一个好主意。如果您正在这样做,请重新考虑您在移动操作中所做的事情。

答案 1 :(得分:1)

这里需要进一步说明。

对于您是否使用 noexcept 声明move构造函数,似乎 std :: vector 尤其挑剔。如果这样做,则std :: vector将使用它们。如果您不这样做,则std :: vector将改为使用复制构造函数。至少在某些情况下。值得注意的是,在调整内部数组大小之后,只要在内部重新调整项目的位置即可。

您可以在此示例中看到效果,其中未声明noexcept:

http://coliru.stacked-crooked.com/a/285cd07a9a52da3b

在此示例中,位置:

http://coliru.stacked-crooked.com/a/d043774ec4c279ec

在第一个示例中,std :: vector在第二个和第三个插入处已经使用push_back使用副本构造函数。在第二个示例中,它执行相同的操作,但是使用move构造函数。