C++ 是否要求移动构造函数不例外?

C++ 是否要求移动构造函数不例外?,c++,c++11,noexcept,C++,C++11,Noexcept,我一直在读一些关于是否允许移动构造函数/赋值抛出的自相矛盾的文章 因此,我想问一下,在最终的C++11标准中是否允许移动构造函数/赋值抛出?通常允许移动构造函数抛出吗?对应该吗?没有 一般来说,你在他们身上所做的任何事情都不应该是任何可能抛出的东西。您不应该分配内存、调用其他代码或诸如此类的事情。编写移动构造函数的唯一原因是带着其他人的内存指针和对象引用潜逃。您应该复制一些基本类型,并清空另一个对象中的值。那些东西不应该扔 因此,虽然这是允许的,但这不是一个好主意。如果你正在这样做,请重新思考你

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


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

通常允许移动构造函数抛出吗?对应该吗?没有

一般来说,你在他们身上所做的任何事情都不应该是任何可能抛出的东西。您不应该分配内存、调用其他代码或诸如此类的事情。编写移动构造函数的唯一原因是带着其他人的内存指针和对象引用潜逃。您应该复制一些基本类型,并清空另一个对象中的值。那些东西不应该扔


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

下面我们将进一步阐明这一点

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

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

在这个例子中,它是:


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

我在标准中没有看到任何关于不允许抛出移动构造函数的内容,但我看到“隐式声明的类X的移动构造函数的形式为
X::X(X&&)
”,在最后的草稿中,我没有看到为任何函数声明的
noexcept
。@ronag:你确定你在找吗?因为我打开了N3337,只搜索了“
noexcept
”,立即得到了某个类的
swap
函数。@Nicolas:我也这么做了,我找到的唯一地方是declval,N3092。你是从哪里得到N3337的?@ronag:从网站上今年的数据。它基本上是一个免费的C++11版本,并更正了拼写错误。此外,N3092是古老的。这是从2010年开始的;我认为标准中还没有异常。或者,如果他们这样做了,它仍然是新的,并且没有外包给标准库?我唯一应该担心的地方是USD?@ronag:如果std::type的move构造函数上没有
noexcept
,则允许它抛出。具体地说,基于节点的容器的一些实现有一个抛出移动构造函数,因为每个容器必须包含一个堆分配的结束节点,甚至是空容器。这些相同容器的其他实现没有这种设计,因此可以(并且允许)使用noexcept move构造函数。