首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >move构造函数是否需要为noexcept?

move构造函数是否需要为noexcept?
EN

Stack Overflow用户
提问于 2012-02-12 23:01:58
回答 2查看 4.6K关注 0票数 21

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

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-02-13 01:05:43

一般情况下允许抛出移动构造函数吗?是。他们应该这样做吗?不是的。

一般来说,你在它们里面做的任何事情都不应该是可能抛出的。你不应该分配内存,调用其他代码,或者任何类似的事情。编写move构造器的唯一原因是要偷走别人的内存指针和对象引用。您应该复制一些基本类型,并将另一个对象中的值设置为空。这些东西不应该抛出。

因此,虽然这是允许的,但这并不是一个好主意。如果你正在做这件事,重新思考你在移动操作中做了什么。

票数 28
EN

Stack Overflow用户

发布于 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构造函数。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9249781

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档