例如,std::vector<int&> vec_int;
这似乎在c ++中无效。为什么这个无效?
答案 0 :(得分:9)
STL容器需要能够使用默认构造函数构造对象。你不能用引用来做到这一点。保证引用有效,因此必须始终使用赋值进行初始化。
您需要使用指针。
答案 1 :(得分:3)
在内部,vector<T>
使用数组来存储一系列T
个对象。由于引用不是对象,因此不存在引用数组(参见标准中的8.3.2§5),因此引用类型不能用于参数化vector
模板。
您可能想要的是智能指针的向量,例如std::vector<boost::shared_ptr<T> >
或专用指针容器,例如boost::ptr_vector<T>
。
答案 2 :(得分:3)
根据上面的chryspi请求回答。正如其他回复中所述,您不能直接使用引用,因为引用本身不存在。
但是,您可以使用引用,但使用boost::reference_wrapper<T>
实用程序类:
typedef boost::reference_wrapper<int> intref;
std::vector<intref> v;
int i;
i = 9;
v.push_back (boost::ref (i)); // store &i
int& j = v[0];
j = 10;
//v[0].get() = 10;
std::cout << i << std::endl; // prints 10
我举了一个如何直接修改元素v[0]
的例子。请注意,它有点棘手(您必须调用get()
方法),因为您获得boost::reference_wrapper<T>
而不是实际参考。
为了安全地存储关于内存的指针,您可以类似地使用boost::shared_ptr
。