为什么auto_ptr可以“密封”容器

时间:2010-06-15 19:55:46

标签: c++ stl const auto-ptr

auto_ptr on wikipedia表示“包含STL容器的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

我很好奇为什么在转移此向量的所有权后,它不能再被修改了?

非常感谢!

2 个答案:

答案 0 :(得分:4)

closed_vec指针包含const vector<ContainedType>类型。由于类型为const,因此您无法在其上调用任何未定义为const的方法(这意味着它们不会更改内部数据)。当然,push_back是非常量的,因为它会更改向量,因此您无法在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

答案 1 :(得分:1)

您无法修改向量,因为closed_vec是一个指向const的指针,因此编译器不会让您修改指针(但您仍然可以移动指针)。要允许修改向量,请将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);
另一方面,

你可以改变指针,但不能移动指针。