我一直在读一些关于移动构造函数/赋值是否允许抛出的文章。
因此,我想问一下,是否允许移动构造函数/赋值在最终的C++11标准中抛出?
发布于 2012-02-13 01:05:43
一般情况下允许抛出移动构造函数吗?是。他们应该这样做吗?不是的。
一般来说,你在它们里面做的任何事情都不应该是可能抛出的。你不应该分配内存,调用其他代码,或者任何类似的事情。编写move构造器的唯一原因是要偷走别人的内存指针和对象引用。您应该复制一些基本类型,并将另一个对象中的值设置为空。这些东西不应该抛出。
因此,虽然这是允许的,但这并不是一个好主意。如果你正在做这件事,重新思考你在移动操作中做了什么。
发布于 2019-08-02 01:59:27
这里将进一步阐明这一点。
似乎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构造函数。
https://stackoverflow.com/questions/9249781
复制相似问题