2010-06-15 2 views
1

auto_ptr on wikipedia 수 auto_ptr은 "는 STL 컨테이너를 포함하는 auto_ptr은 상기 용기의 상기 변형을 방지하기 위해 사용될 수있다."라고. 내가 마지막 행의 주석을 해제하면 왜이 벡터의 소유권을 전송 한 후, 더 이상 수 없다, g ++ 내가 궁금왜 "밀봉"컨테이너

t05.cpp:24: error: passing ‘const std::vector<int, std::allocator<int> >’ 
as ‘this’ argument of ‘void std::vector<_Tp, _Alloc>::push_back(const _Tp&) 
[with _Tp = int, _Alloc = std::allocator<int>]’ discards qualifiers 

같은 오류를보고합니다

auto_ptr<vector<ContainedType> > open_vec(new vector<ContainedType>); 

open_vec->push_back(5); 
open_vec->push_back(3); 

// Transfers control, but now the vector cannot be changed: 
auto_ptr<const vector<ContainedType> > closed_vec(open_vec); 

// closed_vec->push_back(8); // Can no longer modify 

에는 다음과 같은 예를 사용 수정?

고맙습니다.

답변

4

closed_vec 포인터 유형 const vector<ContainedType>을 보유하고 있습니다. 유형이 const이기 때문에, 당신은 또한 (그들은 내부 데이터를 변경하지 않는 의미) const로 정의되지 않은 그 어떠한 방법을 호출 할 수 없습니다. 이 벡터를 변경, 그래서 당신이 가리키는 const 포인터에 전화를 할 수 없기 때문에 당연히 push_back는 const가 아닌이다. 'closed_vec 포인터 - 투 -을 const이기 때문에

vector<ContainedType>* open_vec = new vector<ContainedType>(); 
open_vec->push_back(5); 
open_vec->push_back(3); 

const vector<ContainedType>* closed_vec = open_vec; 
closed_vec->push_back(8); // Fails 
+0

고마워요! :) closed_vec에서 "const"를 간과했습니다. – icephere

+3

그것은 _ auto_ptr과 관련이 있습니다. 일반 포인터를 사용하면 이전의 비 const 포인터를 사용하여 컨테이너를 수정할 수 있습니다. 비 const auto_ptr은 소유권 이전 후에 NULL이됩니다. – MSalters

1

당신은 벡터를 수정할 수 없습니다, 그래서 컴파일러 원 : 그것은 정말 당신이 일반 포인터와 같은을 수행 할 수 auto_ptr와 함께 할 아무것도하지 않습니다 포인터를 수정할 수 있습니다 (그러나 포인터는 계속 움직일 수 있습니다). 당신이

반면에
const auto_ptr<vector<ContainedType> > closed_vec(open_vec); 

로 포인터를 선언했다면, 당신은 pointee을 변경 할 수있을 것입니다 closed_vec

auto_ptr<vector<ContainedType> > closed_vec(open_vec); // no const anymore 
closed_vec->push_back(8); // this now works 

로 벡터의 수정 선언 할 수 있지만하려면 포인터를 움직이십시오.