为什么获取/设置Auto_Ptr会导致此编译器错误

时间:2015-04-13 04:24:37

标签: c++ smart-pointers

我有一张auto_ptr的地图,我只是想设置和获取地图元素,但它产生的编译器错误。我不明白编译器错误意味着什么,并且出了什么问题?

获取编译器错误:

  

[错误]将'const std :: auto_ptr'作为'this'参数传递给   'std :: auto_ptr< _Tp> :: operator std :: auto_ptr_ref< _Tp1>()[with _Tp1 =   INT; _Tp = int]'丢弃限定符[-fpermissive]

设置编译器错误:

  

[错误]'operator ='不匹配(操作数类型为   'std :: map,std :: auto_ptr> :: mapped_type   {aka std :: auto_ptr}'和'int *')

另外我听说不建议在标准c ++库集合(list,vector,map)中使用auto_ptr。我应该在下面的代码中使用什么样的智能指针?

std::map <std::string, std::auto_ptr<int> > myMap;

// Throws compiler error
std::auto_ptr <int> a = myMap["a"];
// Also throws compiler error
myMap["a"] = new int; 

1 个答案:

答案 0 :(得分:5)

首先,请勿使用auto_ptr。它已经破坏了语义并且已被弃用。单一所有权语义的正确指针是 unique_ptr

你可以:

std::map<std::string, std::unique_ptr<int> > myMap;

现在,当您编写myMap["a"]时,将为"a"创建地图中的条目,并返回对该条目的引用。创建的条目是std::unique_ptr<int>{},它是一个“空”指针。

你可以在某个地方提出这一点,但你使用成员函数reset,而不是赋值运算符:

myMap["a"].reset( new int{5} );

或者,从C ++ 14开始,

myMap["a"] = std::make_unique<int>(5);

如果您想要单一所有权,那么您的其他人就没有意义了。您既可以查看原始指针值,也可以获取所有权。取得所有权:

std::unique_ptr<int> new_owner = std::move(myMap["a"]);

将现有的地图条目再次作为“空”指针,new_owner拥有所有权。

如果您只想对地图中的原始指针执行某些操作,则可以使用get()获取该指针,或直接在unique_ptr上使用取消引用运算符:

myMap["a"].reset( new int{5} );
int *raw = myMap["a"].get();
*myMap["a"] = 6;