什么是T(& var)[N]?

时间:2011-04-19 17:36:47

标签: c++ boost

boost/utility/swap.hpp我找到了这段代码:

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或更高版本?

4 个答案:

答案 0 :(得分:7)

对类型为T且长度为N的数组的引用。

这是C指针到数组语法的自然扩展,并得到C ++ 03的支持。

您可以使用cdecl.org来尝试解析这些复杂类型的声明。

答案 1 :(得分: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!

重点:

- 不仅参数必须是数组,而且数组必须大小相同!

答案 2 :(得分:1)

这是声明对名为left和right的T(大小为N)数组的引用的方法。代码是合法的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并进行就地交换。如果您不匹配类型或大小,则会得到方便的编译失败。

答案 3 :(得分:1)

是的,这是很早就允许的标准C ++(基本上是C,加上参考)。

使用typedef可以更容易阅读:

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

它反映了函数typedef

typedef int (*MyFunc)();