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
我很好奇为什么在转移此向量的所有权后,它不能再被修改了?
非常感谢!
答案 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);
另一方面,你可以改变指针,但不能移动指针。