我不确定为什么不编译:
std::vector< const Obj& > myVector;
void foo(const Obj& obj)
{
myVector.push_back( obj );
}
对不起,关于我想要实现的内容的一些额外信息:我不能在不破坏界面的情况下更改foo的签名,但我只想挂在通过foo传递的对象上。我确实想存储它们的指针,但我对如何做到这一点的语法感到困惑。
答案 0 :(得分:15)
你不能有引用的向量。因为向量中的东西必须是可复制和可分配的,并且引用都不是这些。你可能想要一个指针向量:
std::vector< const Obj * > myVector;
void foo( const Obj & obj )
{
myVector.push_back( & obj );
}
答案 1 :(得分:4)
我不确定你是否可以将引用放入这样的容器中。使用
std::vector<const Obj *> myVector
相反,因为它在语义上是等价的。
答案 2 :(得分:4)
您不能将引用用作向量中的类型。您可以使用原始指针,智能指针(boost / std :: tr1 shared_ptr)或其他构造,如boost::ref
和boost::cref
,它们提供围绕普通引用的包装器以适应容器。
答案 3 :(得分:4)
向量仅适用于值类型;你不能有参考文献。
部分原因是引用必须在创建时绑定到现有变量,并且永远不能重新绑定它们。对于能够以“默认”值保存10个元素的向量,使用引用类型是不可能的:
std::vector<const T& obj>(10); // cannot work
同样,您无法为引用重新分配值(除非您打算修改原始变量的值),因此突然myVec[0] = 7
也不起作用。
答案 4 :(得分:4)
或者你可以使用boost::ref
来存储引用,但它很像存储指针。
std::vector< boost::ref< Obj > > myVector;
根据您的编辑,如果您想存储指针,您可以编写如下内容:
std::vector < const Obj* > myVector;
void foo(const Obj& obj)
{
myVector.push_back(&obj);
}
如果你使用boost :: ref或boost :: cref:
std::vector < boost::cref < Obj > > myVector;
void foo(const Obj& obj)
{
myVector.push_back(boost::cref< Obj >(obj) );
}
(可能你也可以省略身体中的最后一个boost :: cref,但我现在还没有编译器。)
答案 5 :(得分:2)
章程 23.1容器要求中的C ++标准指定:
3存储在这些中的对象类型 组件必须符合要求 CopyConstructible类型(20.1.3), 和附加要求 可分配的类型。
换句话说,类型T可以与标准C ++容器一起用作值类型,只要它定义了复制构造函数即可。 CopyConstructible概念由引用的章节中的标准解释,但Boost手册清楚地解释了什么意味着类型是CopyConstructible
参考不符合此要求。
答案 6 :(得分:1)
您无法在STL容器中存储引用,因为引用不是可复制构造的。如果你真的需要“模拟”存储引用,TR1包含一个引用包装器。存储智能指针(例如tr1 :: shared_ptr)或对象实例通常更好。
答案 7 :(得分:1)
除了引用是容器的目标类型的问题之外,您不能将const对象作为容器的目标类型,因为容器实例化的对象类型必须是“可分配”以及“ CopyConstructable“(23.1容器要求)。 Const对象不可分配。
要进行't = u
操作,t
必须等同于u
t
T
类型{{1}} - 容器的类型用。实例化。
但是,正如其他答案中所提到的,您可以在容器中添加指向const对象的指针。