2011-04-19 132 views
4

boost/utility/swap.hpp我發現這段代碼:什麼是T(&var)[N]?

template<class T, std::size_t N> 
void swap_impl(T (& left)[N], T (& right)[N]) 
{ 
    for (std::size_t i = 0; i < N; ++i) 
    { 
    ::boost_swap_impl::swap_impl(left[i], right[i]); 
    } 
} 

什麼是leftright?他們是否參考數組? C++ ISO標準2003或更高版本允許此代碼?

回答

7

的引用類型T和長度N.

這是C的指針到數組語法的自然延伸,並且被支撐的陣列由C++ 03。

你可以使用cdecl.org來嘗試分析這些複雜的類型聲明。

+1

爲什麼 「靜態」 的功能?陣列可以具有自動存儲持續時間。重點是這是對數組的引用,而不是指向其中的指針。 – 2011-04-19 17:44:21

+0

@Steve:我的意思是,與動態數組相比。 – kennytm 2011-04-19 17:45:25

+0

+1 for cdecl.org – yasouser 2011-04-19 18:15:50

2

什麼是左,右?他們是否參考數組? C++ ISO標準2003或更高版本允許此代碼?

是的。他們是參考陣列。

這意味着,你可以調用swap_impl爲:

int a[10]; //array 
int b[10]; 
//... 
swap_impl(a,b); //correct 

但是你不能呼叫swap_impl爲:

int *a = new int[10]; //pointer 
int *b = new int[10]; 
//... 
swap_impl(a,b); //compilation error 

還要注意,你不能這樣做,即使這樣:

int a[10]; 
int b[11]; 
//... 
swap_impl(a,b); //compilation error - a and b are arrays of different size! 

重要點:

- 不僅參數必須是數組,而且數組必須具有相同的大小!

+0

爲什麼「自動」?數組可以有靜態存儲持續時間(例如全局變量)。重點是這是對數組的引用,而不是指向其中的指針。 – 2011-04-19 18:32:52

+0

@Steve:編輯並更正。謝謝。 :-) – Nawaz 2011-04-19 18:56:43

1

這是聲明至T的陣列(大小爲N)的引用名爲Left的方式和權利。該代碼是合法的C++。

這可以讓你在傳遞:

int ones[5] = { 1,1,1,1,1 }; 
int twos[5] = { 2,2,2,2,2 }; 

swap_impl(ones, twos); 

然後模板類型推斷會知道你有T = int和N = 5,做原地掉。如果你的類型或大小不匹配,你會得到一個方便的編譯失敗。

1

是這是C++標準從很早就允許的(它基本上下用加入參考的)。

使用的typedef使得它更易於閱讀:

int main() 
{ 
    typedef int (&MyArray)[4]; 
    int  data[4]; 
    MyArray dataRef = data; 
} 

它有點反映的typedef

typedef int (*MyFunc)();