将指针的引用插入到地图中

时间:2012-01-31 13:45:34

标签: c++ pointers reference

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指向新对象。

3 个答案:

答案 0 :(得分:0)

在您的示例中,std::make_pair的返回类型为std::pair<int, A*>而不是std::pair<int, A*&>(由于模板参数扣除)。

does the trick

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 ++一样,你必须关注清理(如果你不使用智能指针)和对象生命周期。