#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)?
答案 0 :(得分:5)
这与矢量无关。 std::uniqe_ptr
定义移动后对象的状态,将其设置为null(20.7.1 / 4)。
通常,已移动的对象具有有效但未指定的状态。因此,除非无法访问它的类型文档案例,您可以访问它。特定的类可以说应该尽可能地提供该状态的更多细节,但是矢量所依赖的是:
因此,对于向量中除unique_ptr
以外的类型,您可能应该认为移动源的结果值可以是以下任何一种:
如果您仍然认为值得访问可能属于其中任何一个的值,请继续; - )