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



我有一个auto_ptr的映射,我只是试图设置和获取映射元素,但它会产生编译器错误。我不明白编译器错误是什么意思,出了什么问题?

获取编译器错误:

[Error]将"const std::auto_ptr"作为的"this"参数传递'std::auto_ptr&lt_Tp>::运算符std::auto_ptr_ref&lt_Tp1>()[带_Tp1=int_Tp=int]'丢弃限定符[-fpermission]

设置编译器错误:

[Error]不匹配"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; 

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

你可以有:

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

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

您可以在某个地方提出这一点,但是您使用成员函数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;

相关内容

  • 没有找到相关文章

最新更新