2010-06-15 66 views
1

auto_ptr on wikipedia表示“一个包含STL容器的auto_ptr可能被用来阻止对容器的进一步修改”。它使用了下面的例子:为什么一个auto_ptr可以“密封”一个容器

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 

如果我去掉最后一行,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 

我很好奇的错误,为什么转移这一载体的所有权后,就再也不能改性?

非常感谢!

回答

4

closed_vec指针保存类型const vector<ContainedType>。由于类型为const,因此不能调用任何未定义为const的方法(这意味着它们不会更改内部数据)。自然地,push_back是非const的,因为它改变了向量,所以你不能在const指针上调用它。它并不真正有什么用auto_ptr做,你可以完成相同的定期指针:

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 2010-06-15 20:02:38

+3

它_does_与auto_ptr有关。使用常规指针,旧的非const指针仍然可以用来修改容器。所有权转让后,非常量auto_ptr将为NULL。 – MSalters 2010-06-16 09:51:01

1

不能修改的途径,因为closed_vec是一个指针到常量,所以编译器韩元”让你修改指针(但你仍然可以移动指针)。为了使向量的修改,申报closed_vec作为

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

如果你已经宣布的指针

const auto_ptr<vector<ContainedType> > closed_vec(open_vec); 

,另一方面,你就可以改变指针对象,但不移动指针。

相关问题