当我这样做的时候:
std::vector<int> hello;
一切都很好。然而,当我把它变成一个引用向量时:
std::vector<int &> hello;
我就会犯可怕的错误
指向引用的指针是非法的
我想把一堆对struct的引用放到一个vector中,这样我就不用管指针了。为什么矢量会为此大发脾气?我唯一的选择是使用指针的向量代替?
当我这样做的时候:
std::vector<int> hello;
一切都很好。然而,当我把它变成一个引用向量时:
std::vector<int &> hello;
我就会犯可怕的错误
指向引用的指针是非法的
我想把一堆对struct的引用放到一个vector中,这样我就不用管指针了。为什么矢量会为此大发脾气?我唯一的选择是使用指针的向量代替?
当前回答
正如其他人所提到的,您可能最终会使用指针向量。
但是,您可能想要考虑使用ptr_vector代替!
其他回答
正如其他人所提到的,您可能最终会使用指针向量。
但是,您可能想要考虑使用ptr_vector代替!
Boost::ptr_vector<int>将工作。
Edit:是一个建议使用std::vector< boost::ref<int> >,这将不起作用,因为你不能默认构造boost::ref。
是的,你可以,寻找std::reference_wrapper,它模仿引用,但是可赋值的,也可以“重新定位”
容器的组件类型(如向量)必须是可赋值的。引用是不可赋值的(只能在声明时初始化它们一次,以后不能让它们引用其他东西)。其他不可赋值类型也不允许作为容器的组件,例如vector<const int>是不允许的。
正如其他注释所建议的那样,您只能使用指针。 但如果它有帮助,这里有一个技巧来避免直接面对指针。
你可以这样做:
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]);
}