【问题标题】:When std::vector reallocate its memory array, is copy constructor or move constructor used?当 std::vector 重新分配其内存数组时,使用的是复制构造函数还是移动构造函数?
【发布时间】:2021-11-25 08:23:14
【问题描述】:

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

【问题讨论】:

    标签: c++ c++11 stl stdvector


    【解决方案1】:

    如果移动构造函数存在并且是noexcept,则使用它。否则使用复制构造函数。

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

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

    【讨论】:

    • cppreference.com 的文档与您所说的并不完全一致。如果 T 的移动构造函数不是 noexcept 并且 T 不是 CopyInsertable 到 *this 中,vector 将使用抛出移动构造函数。如果它抛出,则放弃保证并且未指定效果。
    • @RSahu 该文档指的是插入的元素;这个问题是关于向量中已经存在的元素的行为。例如。考虑v.reserve( v.capacity() + 1 );
    • std::vector::reserve 使用相同的措辞。
    • @RSahu 我猜这是说具有抛出移动构造函数的不可复制对象将使用该构造函数并放弃强保证,但我不确定如果发生例外。例如。在我看来,对象将从向量中丢失。
    • 听起来标准采取了安全路线并采取了未指定的行为。
    猜你喜欢
    • 2018-03-12
    • 2020-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-12
    • 2020-08-03
    • 2012-11-03
    相关资源
    最近更新 更多