以下内容:
std::map<int, ClassA &> test;
给出:
error C2101: '&' on constant
以下
std::map<ClassA &, int> test;
给出
error C2528: '_First' : pointer to reference is illegal
后者似乎map不能包含键值的引用,因为它有时需要实例化类,并且没有对象就无法实例化引用。但为什么第一种情况不起作用?
答案 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
比使用vector
或set
((*it)->foo()
更容易让人感到困惑。
最后,有一些陷阱(指针的那些):