1

wikipedia 上的 auto_ptr 说“包含 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

我很好奇为什么转移了这个vector的所有权后,就不能再修改了?

非常感谢!

4

2 回答 2

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
于 2010-06-15T19:59:00.773 回答
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);

另一方面,您将能够更改指针,但不能移动指针。

于 2010-06-15T20:04:10.153 回答