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

ron*_*nag 18 c++ noexcept c++11

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

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

Nic*_*las 25

移动构造函数一般是否允许抛出?是.他们应该吗?没有.

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

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

  • @ronag:如果std :: type在其移动构造函数中没有`noexcept`,则允许它抛出.具体来说,基于节点的容器的一些实现具有抛出移动构造函数,因为每个容器必须包含堆分配的端节点,甚至是空容器.这些相同容器的其他实现没有这种设计,因此可以(并且被允许)具有noexcept移动构造函数. (10认同)

bja*_*d_e 8

这是为了进一步阐明这一点。

似乎std::vector对于是否使用noexcept声明移动构造函数特别挑剔。如果这样做,则 std::vector 将使用它们。如果您不这样做,则 std::vector 将改用您的复制构造函数。至少在某些情况下。尤其是在内部数组调整大小之后,每当它在内部重新排列项目时。

您可以在这个示例中看到效果,其中没有声明 noexcept:

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

在这个例子中,它在哪里:

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

在第一个示例中,std::vector 使用已在第二次和第三次插入时使用 push_back 的复制构造函数。在第二个示例中,它执行相同的操作,但使用移动构造函数。