将std :: vector传递给数组引用

时间:2014-11-14 00:19:25

标签: c++

我在尝试将一些老式C ++代码与更现代的数据结构接口时遇到了问题。 很遗憾,我无法更改旧代码的界面,因此我坚持使用已编写的函数

特别是,有一个函数将以下参数作为参数:

int doStuff(FooObj* (&foo_array), int n_elements) {
  // do stuff with array member 0
  FooObj* foo = &(foo_array[0])
 ... 
}

基本上,在遗留代码中使用此函数的方式是在堆上创建指向FooObj数组的指针,然后传递给函数:

FooObj* foos;
foos = new FooObj[100];
doStuff(foos, 100);
delete [] foos;

我想要做的是传入FooObj的向量(因为内容将动态调整大小),但我无法理解指针/引用语义。如果我尝试以下内容:

std::vector<FooObj> foos;
foos.resize(100);
doStuff(&foos[0], 100);

我收到错误:invalid initialization of non-const reference of type 'FooObj*&' from a temporary of type 'FooObj*'

是否可以传递这样的矢量?

1 个答案:

答案 0 :(得分:2)

这与堆与堆栈无关。一个近似的经验法则:当传递一个被声明为引用的参数时,你必须传递一个左值。所以:

std::vector<FooObj> foos;
foos.resize(100);

FooObj *p=&foos[0];

doStuff(p, 100);

您收到编译器错误的原因是因为表达式“&foos[0]”是一个右值,您必须在此处粘贴左值。所以:把它变成左值。