为什么我不能做一个引用向量?

当我这样做:

std::vector<int> hello; 

一切都很好。 但是,当我把它作为引用的向量时:

 std::vector<int &> hello; 

我得到可怕的错误,如“错误C2528:'指针':参考指针是非法的”。

我想把一堆对struct的引用放到一个向量中,这样我就不需要插入指针了。 为什么矢量这个发脾气? 我唯一的选择是使用指针向量吗?

像矢量这样的容器组件类型必须是Assignable 。 引用是不可赋值的(你只能在声明它们时初始化它们,而且以后不能再引用它们)。 其他不可分配的类型也不允许作为容器的组件,例如vector<const int>是不允许的。

是的,你可以,寻找std::reference_wrapper ,模仿引用,但是可分配的,也可以“重置”

就其性质而言,引用只能在创建时设置; 即以下两行有非常不同的效果:

 int & A = B; // makes A an alias for B A = C; // assigns value of C to B. 

还有,这是非法的:

 int & D; // must be set to a int variable. 

但是,创建矢量时,无法在创建时将值分配给它的项目。 你基本上只是做了最后一个例子。

boost::ptr_vector<int>将起作用。

编辑:是建议使用std::vector< boost::ref<int> > ,这是行不通的,因为你不能默认构建一个boost::ref

Ion Todirel已经提到了使用std::reference_wrapper的答案YES由于C ++ 11,我们有一个机制来从std::vector检索对象,并使用std::remove_reference删除引用。 下面给出一个使用g++clang选项编译的例子
-std=c++11并成功执行。

 #include <iostream> #include <vector> #include<functional> class MyClass { public: void func() { std::cout << "I am func \n"; } MyClass(int y) : x(y) {} int getval() { return x; } private: int x; }; int main() { std::vector<std::reference_wrapper<MyClass>> vec; MyClass obj1(2); MyClass obj2(3); MyClass& obj_ref1 = std::ref(obj1); MyClass& obj_ref2 = obj2; vec.push_back(obj_ref1); vec.push_back(obj_ref2); for (auto obj3 : vec) { std::remove_reference<MyClass&>::type(obj3).func(); std::cout << std::remove_reference<MyClass&>::type(obj3).getval() << "\n"; } } 

这是C ++语言的一个缺陷。 你不能把一个引用的地址,因为试图这样做会导致被引用的对象的地址,因此你永远不会得到一个引用的指针。 std::vector使用指向其元素的指针,所以被存储的值需要能够被指向。 你将不得不使用指针。

正如其他人所提到的,你可能最终会使用一个指针向量。

但是,您可能需要考虑使用ptr_vector !

正如其他评论所暗示的,你只能使用指针。 但是,如果有帮助,这是一种避免直接面对指针的技术。

你可以做如下的事情:

 vector<int*> iarray; int default_item = 0; // for handling out-of-range exception int& get_item_as_ref(unsigned int idx) { // handling out-of-range exception if(idx >= iarray.size()) return default_item; return reinterpret_cast<int&>(*iarray[idx]); }