在C++中我们应该少用指针,多用引用,原因请大家自行搜索。在传递数组的时候我们需要格外注意,先让我们看一个简单的范例。
// PassArray.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <iostream>
using namespace std;
template <typename T>
void Func1(T, T);
template <typename T>
void Func2(T&, T&);
void Func3(int (&)[10], int (&)[12]);
int _tmain(int argc, _TCHAR* argv[])
{
int a[10], b[12];
Func1(a, b);
Func2(a, b);
Func3(a, b);
return 0;
}
template <typename T>
void Func1(T, T)
{
cout<<"Func1.invoked!"<<endl;
}
template <typename T>
void Func2(T&, T&)
{
cout<<"Func2.invoked!"<<endl;
}
void Func3(int (&m)[10], int (&n)[12])
{
cout<<"Func3.invoked!"<<endl;
}
首先这个范例无法编译通过:
原因就出在类型推断上。根据定义,Func2的类型必须是T&,也就是说传递实参的时候,两个形参必须是相同的,而这一点在模板编程中就会由编译器来负责推断。
Func1:
调用Func1(a, b)则推断的类型分别是Func1(int*, int*),调用函数将会自动将数组的首地址指针作为实参进行传递,因此类型推断两形参相同,编译通过!
Func2:
调用Func2(a, b)因为我们希望按引用的方式进行实参传递,因此需要遵循这样的规律:
(P208)如果形参是数组的引用,编译器将不会将数组实参转化为指针,而是传递数组引用的本身。在这种情况下,数组大小成为形参和实参类型的一部分。
所以推断类型分别是Func2(int (&)[10], int (&)[12]),因为int (&)[10] != int (&)[12],所以与T == T相悖!自然也就编译不过了!
Func3:
该函数是Func2的一个静态表示,通过上面的解释应该很容易理解这个代码了。