2011-04-19 134 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)();