所以平時當你輸入函數參數數組聲明他們是這樣的:這些數組類型有何不同?
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