參考陣列的函式之間有什么區別:
// reference to array
void f_(char (&t)[5]) {
auto t2 = t;
}
和簡單的陣列:
// just array
void f__(char t[5]) {
auto t2 = t;
}
作為引數?
呼叫代碼為:
char cArray[] = "TEST";
f_(cArray);
f__(cArray);
char (&rcArr)[5] = cArray;
f_(rcArr);
f__(rcArr);
在兩種情況下T2是炭*,但在第一功能我的VS2019是表示噸內部函式具有型別CHAR(&T)[]和噸第二函式內部有型別的char *。
那么畢竟,這些功能之間有什么實際區別嗎?
uj5u.com熱心網友回復:
您可以指定一個完整的陣列型別引數,例如
void f( int ( &a )[N] );
在函式中,您將知道傳遞的陣列中的元素數。
當函式被宣告為
void f( int a[] );
然后編譯器像這樣調整函式宣告
void f( int *a );
并且您無法確定傳遞的陣列中的元素數量。所以你需要指定第二個引數,比如
void f( int *a, size_t n );
具有參考陣列引數型別的函式也可能被多載。例如這兩個宣告
void f( int ( &a )[] );
和
void f( int ( &a )[2] );
宣告兩個不同的函式。
并且可以使用花括號串列呼叫具有參考陣列引數型別的函式(前提是相應的引數具有限定符 const),例如
f( { 1, 2, 3 } );
這是一個演示程式
#include <iostream>
void f( const int ( &a )[] )
{
std::cout << "void f( const int ( & )[] ) called.\n";
}
void f( const int ( &a )[2] )
{
std::cout << "void f( const int ( & )[2] ) called.\n";
}
void f( const int a[] )
{
std::cout << "void f( const int [] ) called.\n";
}
int main()
{
f( { 1, 2, 3 } );
}
程式輸出是
void f( const int ( & )[] ) called.
uj5u.com熱心網友回復:
由于您不能按值傳遞陣列(C 繼承的 C 限制),因此將引數宣告為陣列的任何宣告都將“衰減”為指標(丟失其大小)。所以宣告
void f__(char t[5])
等同于
void f__(char *t)
其他一切都由此而來——在 , 的主體內f__,t有一個指標型別,而不是一個陣列型別。因此,auto從中進行的任何推斷都將基于該指標型別。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/385109.html
