为什么 Getting/Setting Auto_Ptr 导致此编译器错误
Why Does Getting/Setting Auto_Ptr Cause This Compiler Error
我有一张 auto_ptr 的地图,我只是想设置和获取地图元素,但它会产生编译器错误。我不明白编译器错误是什么意思,出了什么问题?
获取编译器错误:
[Error] passing 'const std::auto_ptr' as 'this' argument of
'std::auto_ptr<_Tp>::operator std::auto_ptr_ref<_Tp1>() [with _Tp1 =
int; _Tp = int]' discards qualifiers [-fpermissive]
设置编译器错误:
[Error] no match for 'operator=' (operand types are
'std::map, std::auto_ptr >::mapped_type
{aka std::auto_ptr}' and 'int*')
我还听说不建议在标准 c++ 库集合(列表、矢量、地图)中使用 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"
在地图中创建一个条目,并且此 returns 是对其的引用。创建的条目是 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"]);
这将再次将现有地图条目保留为 "null" 指针,并且 new_owner
拥有所有权。
如果你只想对映射中的原始指针做一些事情,那么你可以使用 get()
来获取该指针,或者直接在 unique_ptr
:
myMap["a"].reset( new int{5} );
int *raw = myMap["a"].get();
*myMap["a"] = 6;
我有一张 auto_ptr 的地图,我只是想设置和获取地图元素,但它会产生编译器错误。我不明白编译器错误是什么意思,出了什么问题?
获取编译器错误:
[Error] passing 'const std::auto_ptr' as 'this' argument of 'std::auto_ptr<_Tp>::operator std::auto_ptr_ref<_Tp1>() [with _Tp1 = int; _Tp = int]' discards qualifiers [-fpermissive]
设置编译器错误:
[Error] no match for 'operator=' (operand types are 'std::map, std::auto_ptr >::mapped_type {aka std::auto_ptr}' and 'int*')
我还听说不建议在标准 c++ 库集合(列表、矢量、地图)中使用 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"
在地图中创建一个条目,并且此 returns 是对其的引用。创建的条目是 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"]);
这将再次将现有地图条目保留为 "null" 指针,并且 new_owner
拥有所有权。
如果你只想对映射中的原始指针做一些事情,那么你可以使用 get()
来获取该指针,或者直接在 unique_ptr
:
myMap["a"].reset( new int{5} );
int *raw = myMap["a"].get();
*myMap["a"] = 6;