21

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

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

4

2 回答 2

28

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

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

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

于 2012-02-12T17:05:42.897 回答
5

在这里进一步阐明这一点。

似乎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。在第二个示例中,它执行相同的操作,但使用的是移动构造函数。

于 2019-08-01T17:59:27.293 回答