我正在MinGW64
使用eclipse
,语言为C++
,如上所述。
我有以下代码:
double * my_Function (my_Class I1, my_Class I2, double return_vector[3])
{
double test[3];
double (&rtest)[3]=test;
double (&description_vector)[3] = return_vector;
// some more code
return (description_vector);
}
绑定rtest到测试工作正常,这里编译器告诉我warning: unused variable
,这是预期的,因为它在代码中的任何地方都没有使用,我只是想知道它是否原则上有效。
但是,将description_vector
绑定到return_vector
会导致以下错误:
error: invalid initialization of reference of type 'double (&)[3]' from expression of type 'double*'
为什么呢?为什么绑定rtest来测试合法而不是description_vector
与return_vector
的绑定?
所以你可能会问“但为什么要将引用description_vector
绑定到return_vector
?只需在你的return语句中使用return_vector
- 它毕竟是一样的。”
我想向代码的读者提供信息(基本上我将来会看到它)。通过这种方式,您可以看到必须将向量传递给函数才能返回计算结果。
您看到description_vector
是return_vector
的别名,并且description_vector
的名称可以看到它应该保留的内容。
答案 0 :(得分:0)
当您将数组传递给函数时,它会衰减到指向第一个元素的指针,并且您无法将其绑定到对数组的引用。您应该将对数组的引用作为参数传递,或者使用向量(和迭代器)使您的生活更轻松。
答案 1 :(得分:0)
即使两个数组签名看起来很相似,编译器实际上会将return_array作为double *传递,而不像测试数组是double [3]。基本上他们是不同的类型。像这样传递数组是double *的缩写。
答案 2 :(得分:0)
double * my_Function (my_Class I1, my_Class I2, double return_vector[3])
// ^^^^^^^^^^^^^^^^^^^^^^^
函数声明中使用的带下划线的语法与double*
相同。编译器很高兴地忽略了这个边界,并且只是一个注释,比如说return_vector
应该指向的数组的大小。
数组不是指针,它们在传递给函数时衰减指针。这就是绑定test
的原因,因为它是一个合适的数组。
如果你想在函数内部使用引用,你也需要将引用作为参数。
答案 3 :(得分:0)
您的功能实际上与:
相同double * my_Function (my_Class I1, my_Class I2, double *return_vector)
这是函数形式参数列表语法的历史怪癖。
此外,数组不能通过C ++中的值传递(没有数组类型的右值)。