与c ++函数中的参数混淆?

时间:2014-03-16 07:27:04

标签: c++ c declaration

2个功能有什么区别?

//a

template <typename T, int N>
int g( T (&a)[ N ] )
{
    return N;
}

//b    

template <typename T, int N>
int g( T &a[ N ] )
{
    return N;
}

可以编译代码// a,但对于// b我收到错误:“declaration of 'a' as array of references”。 任何人都可以更清楚地向我解释这个错误吗? 谢谢!

2 个答案:

答案 0 :(得分:5)

在C ++中,某些类型的语法很奇怪,因为经常出现这种混淆。

  • T (&a)[N] 是一个大小为N的T数组的引用,这是语言允许的,因此第一个代码会编译。

  • T &a[N]一个大小为T的引用(N)的数组,该语言不允许这样做,因此它不会&# 39; t compile。

答案 1 :(得分:2)

在第二种情况下,operator precedence表示索引[]位于引用&之前。在第一种情况下,您正在引用具有N类型T对象的数组,而在第二种情况下,您有一个数组N引用类型为{的对象{1}},这是无效的。