所以平时当你输入函数参数数组声明他们是这样的:这些数组类型有何不同?
f (const float offset [ 3 ])
但我一直在努力有他们的项目申报,像这样:
f (const float (&offset) [ 3 ])
那有什么改变什么意思?据我所知,我们已经有效地传递了一个指针。强制这样的参考甚至是什么呢?
所以平时当你输入函数参数数组声明他们是这样的:这些数组类型有何不同?
f (const float offset [ 3 ])
但我一直在努力有他们的项目申报,像这样:
f (const float (&offset) [ 3 ])
那有什么改变什么意思?据我所知,我们已经有效地传递了一个指针。强制这样的参考甚至是什么呢?
f (const float offset [ 3 ])
在这种情况下,3是无意义的。 offset
甚至不是一个数组,它是一个指针(const float*
)。所以这个函数将接受任何浮点指针,并且任何大小的浮点数都会被衰减接受。
float x2[2];
float x3[3];
float x4[4];
float* fp;
f(x2); // compiles
f(x3); // compiles
f(x4); // compiles
f(fp); // compiles
此外,在该函数内:
sizeof(offset) == sizeof(float*)
然而,
f (const float (&offset) [ 3 ])
在这种情况下,offset
是3常量漂浮数组的引用。只有3个花车阵列才会被接受为参数。
f(x2); // does not compile
f(x3); // compiles
f(x4); // does not compile
f(fp); // does not compile
而且里面的功能:
sizeof(offset) == sizeof(float) * 3
我的下一个问题是为什么括号是必需的?如果我不在MSVC2010中使用它们,则会出现错误,指出不允许引用数组。这只是MSVC的一个怪癖,或者类型符号的优先级是如何工作的? – BlamKiwi 2014-10-30 03:33:52
@MorphingDragon:哪个括号?括号?是的,它们是必要的,这正是编译器告诉你的原因。没有它们,编译器会认为你正在试图声明一个引用数组(而不是对数组的引用),这是不允许的。 – 2014-10-30 03:40:44
牢记数组不是指针和该签名只是自动的改变为指针在第一种情况下,因为它是一个函数参数的变化相当大的。它不再接受指针参数。 – chris 2014-10-30 03:20:34
目前尚不清楚,似乎'f'是一个函数调用,所以'offset'可能是'float **'。添加更多代码! – gmas80 2014-10-30 03:22:24