2011-12-12 4 views
2
#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입니다)?

답변

5

벡터와는 관계가 없습니다. std::uniqe_ptr은 이동 후 개체의 상태를 정의하며 null (20.7.1/4)로 설정됩니다.

일반적으로 이동 된 개체는 유효하지만 지정되지 않은 상태입니다. 따라서 유형이 문서에 액세스 할 수없는 경우 문서에 액세스 할 수 있습니다. 특정 클래스는 틀림없이 가능한 한 그 상태의 자세한 내용을 제공,하지만 벡터에 의존하는 것입니다해야합니다

  1. 객체가 (그렇지 않으면 벡터 재 할당 할 수 없을 것입니다)
  2. 다시 이동할 수 있습니다 벡터가 파괴되면 객체는 여전히 파괴 될 수 있습니다.

    1. 에 "빈"또는 :

    그래서, 벡터 unique_ptr 이외의 유형, 당신은 아마 이동의 소스의 결과 값 중 하나 일 수 있다고 자신에게 생각해야한다 유형의 "제로"값,

  3. 원래 값,
  4. 대상 이동의의 원래 값, 당신은 얇은하지 않았다 종류의
  5. 다른 값 k의.

당신은 여전히 ​​그 중 하나 일 수있는 값에 접근 가치을 생각하면는 앞서 ;-)

+0

이 뒤에 이론적 근거가 이동 된 요소가 파괴 할 상태에 있어야한다는 것입니다 이동합니다. –

+0

+1. 하지만, 예기치 않게 오랜 시간 동안 할당 된 리소스를 남겨 둘 수 있기 때문에 이동 할당이 스왑과 동등하지 않아야한다고 감히 말합니다. 그래서 (3)의 경우는 내가 기대하는 것이 아닙니다. – sellibitze

+1

@sellobitze : 아니오, 나는 그것이 합법적 인 것으로서 일반적인 일의 예가되도록 의도하지 않았기 때문에 일어 났을 때 범한 일이 될 수는 없습니다. –

관련 문제