C++ 当std::vector重新分配其内存数组时,是否使用复制构造函数或移动构造函数?

C++ 当std::vector重新分配其内存数组时,是否使用复制构造函数或移动构造函数?,c++,c++11,stl,stdvector,C++,C++11,Stl,Stdvector,当std::vector重新分配其内存数组时,使用什么样的复制/移动构造函数将元素复制/移动到新居?如果移动构造函数存在且不例外,则使用它。否则将使用复制构造函数 使用可能抛出的移动构造函数是不可取的,因为可能会发生某些对象被移动到新存储,然后异常会阻止其他对象被移动的情况 cppreference.com网站确实指出,如果对象是不可复制的,但具有非noexcept移动构造函数,那么它将使用该移动构造函数,如果引发异常,则会有未指定的行为。我猜这意味着元素可能会从向量中丢失。如果move构造函数

当std::vector重新分配其内存数组时,使用什么样的复制/移动构造函数将元素复制/移动到新居?

如果移动构造函数存在且不例外,则使用它。否则将使用复制构造函数

使用可能抛出的移动构造函数是不可取的,因为可能会发生某些对象被移动到新存储,然后异常会阻止其他对象被移动的情况


cppreference.com网站确实指出,如果对象是不可复制的,但具有非noexcept移动构造函数,那么它将使用该移动构造函数,如果引发异常,则会有未指定的行为。我猜这意味着元素可能会从向量中丢失。

如果move构造函数存在且不例外,则使用它。否则将使用复制构造函数

使用可能抛出的移动构造函数是不可取的,因为可能会发生某些对象被移动到新存储,然后异常会阻止其他对象被移动的情况


cppreference.com网站确实指出,如果对象是不可复制的,但具有非noexcept移动构造函数,那么它将使用该移动构造函数,如果引发异常,则会有未指定的行为。我想这意味着向量中的元素可能会丢失。

上的文档与您所说的不完全一致。如果T的移动构造函数不是noexcept,并且T不可复制插入*中,vector将使用抛出移动构造函数。如果抛出,则放弃担保,并且未指定效果,说明文档引用了插入的元素;这个问题是关于向量中已有元素的行为。例如考虑V.储备V.容量+ 1;使用相同的措辞。@RSahu我想这是说带有抛出移动构造函数的不可复制对象将使用该构造函数并放弃强保证,但我不确定在出现异常时会有什么行为。例如,在我看来,物体将从矢量中丢失。这听起来像是标准采取了安全路线,并采取了未指明的行为。上的文档与您所说的不完全一致。如果T的移动构造函数不是noexcept,并且T不可复制插入*中,vector将使用抛出移动构造函数。如果抛出,则放弃担保,并且未指定效果,说明文档引用了插入的元素;这个问题是关于向量中已有元素的行为。例如考虑V.储备V.容量+ 1;使用相同的措辞。@RSahu我想这是说带有抛出移动构造函数的不可复制对象将使用该构造函数并放弃强保证,但我不确定在出现异常时会有什么行为。在我看来,物体将从矢量中丢失。这听起来像是标准采取了安全路线,并采取了未指明的行为。