当我这样做的时候:
std::vector<int> hello;
一切都很好。然而,当我把它变成一个引用向量时:
std::vector<int &> hello;
我就会犯可怕的错误
指向引用的指针是非法的
我想把一堆对struct的引用放到一个vector中,这样我就不用管指针了。为什么矢量会为此大发脾气?我唯一的选择是使用指针的向量代替?
当我这样做的时候:
std::vector<int> hello;
一切都很好。然而,当我把它变成一个引用向量时:
std::vector<int &> hello;
我就会犯可怕的错误
指向引用的指针是非法的
我想把一堆对struct的引用放到一个vector中,这样我就不用管指针了。为什么矢量会为此大发脾气?我唯一的选择是使用指针的向量代替?
当前回答
是的,你可以,寻找std::reference_wrapper,它模仿引用,但是可赋值的,也可以“重新定位”
其他回答
这是c++语言的一个缺陷。您不能获取引用的地址,因为尝试这样做将导致被引用对象的地址,因此您永远无法获得指向引用的指针。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]);
}
Boost::ptr_vector<int>将工作。
Edit:是一个建议使用std::vector< boost::ref<int> >,这将不起作用,因为你不能默认构造boost::ref。
根据它们的本质,引用只能在创建时设置;也就是说,下面两行有非常不同的效果:
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.
然而,当你创建一个向量时,没有办法在创建时给它的项赋值。实际上你只是做了一大堆上一个例子。
没有技术上的原因为什么你不能有一个引用向量,它只是不是API的一部分,大概是为了保持它类似于数组。可以很容易地添加专门化,使用引用,在内部将它们存储为指针,并在API中显示为引用:
vector<int&> ivref;
int i = 42;
ivref.push_back(i); // address of i is stored
ivref.front() = 43; // i is set to 43
ivref.push_back(44); // Marked deleted for rvalue references
ivref.resize(10); // Marked deleted for vector of references