什么包含移动的向量元素?

时间:2011-12-12 10:20:26

标签: c++ c++11

#include <vector>
#include <iostream>
#include <memory>

int main()
{
    // create the vector
    std::vector< std::unique_ptr< int > > v;
    for ( int i = 0; i < 5; ++ i )
    {
        std::unique_ptr< int > newItem( new int(i) );
        v.push_back( std::move( newItem ) );
    }

    std::cout<<"vector's size before the move = " << v.size() << std::endl;

    // move one item
    auto it = move( v[2] );
    std::cout<<"moved element = " << *it << std::endl;
    std::cout<<"vector's size after the move = " << v.size() << std::endl;
if ( nullptr == v[2].get())
    std::cout<<"it is nullptr" << std::endl;
}

上面的示例是将一个元素移出矢量,但矢量的大小保持不变。

移动后包含移动元素的内容是什么?访问该元素是不确定的行为?是nullptr(示例打印它是null)?

1 个答案:

答案 0 :(得分:5)

这与矢量无关。 std::uniqe_ptr定义移动后对象的状态,将其设置为null(20.7.1 / 4)。

通常,已移动的对象具有有效但未指定的状态。因此,除非无法访问它的类型文档案例,您可以访问它。特定的类可以说应该尽可能地提供该状态的更多细节,但是矢量所依赖的是:

  1. 可以再次移动对象(否则向量将无法重新分配)
  2. 当矢量被破坏时,对象仍然可以被销毁。
  3. 因此,对于向量中除unique_ptr以外的类型,您可能应该认为移动源的结果值可以是以下任何一种:

    1. 类型的“空”或“零”值,
    2. 原始值,
    3. 移动的目标的原始值
    4. 您没想到的其他类型的其他值。
    5. 如果您仍然认为值得访问可能属于其中任何一个的值,请继续; - )