当我这样做的时候:
std::vector<int> hello;
一切都很好。然而,当我把它变成一个引用向量时:
std::vector<int &> hello;
我就会犯可怕的错误
指向引用的指针是非法的
我想把一堆对struct的引用放到一个vector中,这样我就不用管指针了。为什么矢量会为此大发脾气?我唯一的选择是使用指针的向量代替?
当我这样做的时候:
std::vector<int> hello;
一切都很好。然而,当我把它变成一个引用向量时:
std::vector<int &> hello;
我就会犯可怕的错误
指向引用的指针是非法的
我想把一堆对struct的引用放到一个vector中,这样我就不用管指针了。为什么矢量会为此大发脾气?我唯一的选择是使用指针的向量代替?
当前回答
根据它们的本质,引用只能在创建时设置;也就是说,下面两行有非常不同的效果:
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>将工作。
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.
然而,当你创建一个向量时,没有办法在创建时给它的项赋值。实际上你只是做了一大堆上一个例子。
正如其他人所提到的,您可能最终会使用指针向量。
但是,您可能想要考虑使用ptr_vector代替!
我在c++ 14中找到了原因,“国际标准ISO/IEC 14882:2014(E)编程语言c++”
(8.3.2-5.s1) 没有引用的引用,没有引用的数组,也没有引用的指针。
Ion Todirel已经使用std::reference_wrapper提到了一个答案是。从c++ 11开始,我们就有了从std::vector中检索object并使用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";
}
}