为什么我不能做一个引用向量?
当我这样做:
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]); }