包含引用的STL映射无法编译

时间:2010-05-29 06:04:39

标签: c++ stl reference map

以下内容:

std::map<int, ClassA &> test;

给出:

error C2101: '&' on constant

以下

std::map<ClassA &, int> test;

给出

error C2528: '_First' : pointer to reference is illegal

后者似乎map不能包含键值的引用,因为它有时需要实例化类,并且没有对象就无法实例化引用。但为什么第一种情况不起作用?

3 个答案:

答案 0 :(得分:16)

在stl容器中存储引用是非法的,因为类型必须是可复制构造和可分配的。无法分配参考文献。

究竟是什么操作导致第一个错误是依赖于实现的,但我认为它与创建引用有关,而不是立即分配它。第二条错误消息看起来与构建地图索引实际相关。

如果您的类型很小,您可以将其复制到地图中,或者如果它很大,请考虑使用指针,但请记住容器不会为您解除分配对象,您必须自己明确地执行此操作。

This你可能会对这个问题感兴趣。

答案 1 :(得分:3)

§8.3.2第5节

  

不应引用引用,不引用引用数组,也不引用引用指针。

你可能认为引用是有趣的指针。他们不是。

答案 2 :(得分:1)

您不能存储引用,因为它们不是可复制构造的(并且某些操作是不可能的,因为它们也不是默认构造的。)

但是,您可以使用指针模拟行为:

std::map<int, ClassA*> test;

这有点烦人,因为你需要解除引用两次:

std::map<int, ClassA*>::iterator it = test.begin();

it->second->foo();

但使用map比使用vectorset(*it)->foo()更容易让人感到困惑。

最后,有一些陷阱(指针的那些):

  • 只要您希望使用指针
  • ,您必须确保指向的对象将保持活动状态
  • 指针的默认初始化是一个随机值,使用它会导致未定义的行为
  • 当指针被扔掉时,对象仍然存在(幸运的是),但它确实意味着你需要让它在某一时刻被摧毁