struct A
{
};
int main()
{
A *a = new A;
std::unordered_map<int, A*&> hash;
hash.insert(make_pair(1, a)); //error
}
使这项工作的语法是什么?
如果我这样做:
a = new A;
我希望hashmap
指向新对象。
答案 0 :(得分:0)
在您的示例中,std::make_pair
的返回类型为std::pair<int, A*>
而不是std::pair<int, A*&>
(由于模板参数扣除)。
hash.insert(std::make_pair<int, A*&>(1, a)); //no error
请注意,存储对地图和其他数据结构的引用并不常见。想想你是否真的需要它。
答案 1 :(得分:0)
hash.insert( std :: pair&lt; int,A *&amp;&gt; (1,a));
答案 2 :(得分:0)
这个问题忽略了STL设计中固有的value-semantics的观点。
价值语义意味着
将值存储并复制到容器(包括指针)中,而不是引用。
当您将某物插入容器时,即使您传入的内容是参考变量,也会制作并存储副本。
这意味着你不能拥有像std :: vector&lt;&gt;这样的结构。参考文献。
在您的具体示例中,省略参考符号(&amp;)并且您没事(除了内存泄漏)。 在stl中存储指针很便宜,因此您不必担心复制指针的成本。
但是,与C ++一样,你必须关注清理(如果你不使用智能指针)和对象生命周期。