如何将对象添加到向量<const obj&=“”>?</const>

时间:2010-01-25 21:44:42

标签: c++

我不确定为什么不编译:

std::vector< const Obj& > myVector;

void foo(const Obj& obj) 
{
    myVector.push_back( obj );  
}  

对不起,关于我想要实现的内容的一些额外信息:我不能在不破坏界面的情况下更改foo的签名,但我只想挂在通过foo传递的对象上。我确实想存储它们的指针,但我对如何做到这一点的语法感到困惑。

8 个答案:

答案 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::refboost::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对象的指针。