C++通过引用传递数组

kir*_*off 62 c++ arrays pointers reference pass-by-reference

这是允许通过引用传递数组?

 void foo(double& *bar) 
Run Code Online (Sandbox Code Playgroud)

似乎我的编译器说没有.为什么?通过引用传递数组的正确方法是什么?还是一个解决方法?我有一个数组参数,我的方法应该修改,然后我应该检索.或者,我可以使这个数组成为一个类成员,它工作正常,但它对我的代码的其他部分有很多缺点(我想避免).

感谢致敬.

jro*_*rok 106

数组只能通过引用传递,实际上:

void foo(double (&bar)[10])
{
}
Run Code Online (Sandbox Code Playgroud)

这可以防止你做以下事情:

double arr[20];
foo(arr); // won't compile
Run Code Online (Sandbox Code Playgroud)

为了能够传递任意大小的数组foo,使其成为模板并在编译时捕获数组的大小:

template<typename T, size_t N>
void foo(T (&bar)[N])
{
    // use N here
}
Run Code Online (Sandbox Code Playgroud)

您应该认真考虑使用std::vector,或者如果您有一个支持c ++ 11的编译器,std::array.

  • "但是,一旦传递给`foo`,阵列就会衰减到指针".不,它没有,因为您只能传递10个元素的数组,所以您不需要有关大小的更多信息.(再一次,你_cannot_将一个数组传递给`void foo(double*&)`;隐式转换的结果是一个rvalue,并且不能用于初始化对非const的引用.你必须使用`void foo (double*const&);`. (6认同)

Jam*_*nze 14

是的,但是当参数匹配引用时,指向的隐式数组不是自动的,所以你需要这样的东西:

void foo( double (&array)[42] );
Run Code Online (Sandbox Code Playgroud)

要么

void foo( double (&array)[] );
Run Code Online (Sandbox Code Playgroud)

请注意,但是,匹配时,double [42]并且double []是不同的类型.如果你有一个未知维度的数组,它将匹配第二个,但不匹配第一个,如果你有一个包含42个元素的数组,它将匹配第一个而不是第二个.(后者是,恕我直言,非常反直觉.)

在第二种情况下,您还必须传递维度,因为一旦您进入函数内部就无法恢复它.

  • 第二个不为我编译. (6认同)
  • 我不相信第二个例子是有效的标准符合C++.顺便说一下,它不能用GCC 4.8或Clang 3.4编译.我认为需要模板尺寸. (6认同)
  • @Ricky65就是这样.我想知道为什么.通常允许对不完整类型的引用作为函数参数.(当然,在这种情况下,类型在完成时会改变:`double []`和`double [42]`是两种不同的类型.所以你唯一可以传递给后者的形式就是一个数组未知的长度,例如`extern double d [];`或者其他一些.这严重限制了可用性.) (2认同)
  • 也许应该修复这个答案以反映这一点? (2认同)

Nas*_*zta 6

如果您只想修改元素:

void foo(double *bar);
Run Code Online (Sandbox Code Playgroud)

足够.

如果要将地址修改为(例如:) realloc,但它不适用于数组:

void foo(double *&bar);
Run Code Online (Sandbox Code Playgroud)

是正确的形式.

  • 第二种情况不适用于数组,期间.它只有在你有指针类型的实际变量时才有效. (7认同)
  • 除了你不能将数组传递给后者.他询问数组,而不是指针. (3认同)

moo*_*eep 6

当您使用C++时,这里仍然缺少的强制性建议是使用std::vector<double>.

您可以通过引用轻松传递它:

void foo(std::vector<double>& bar) {}
Run Code Online (Sandbox Code Playgroud)

如果你有C++ 11的支持,也可以看看std::array.

以供参考:

  • :-)是的.`std :: vector`通常是最好的解决方案.但也有例外. (3认同)