1. Array Arguments
const char name[] = "ZZH"; // name's type is
// const char[13]
const char * ptrToName = name; // array decays to pointer
学过C语言的人 都知道 name的真实类型 是const char[13] ,他的目标类型是 const char
const char *的目标类型是 const char 所以他可以指向该数组
2. 那么当pass by value 传进去一个数组名,会被推断成什么类型呢?
template<typename T>
void f(T param); // template with by-value parameter
f(name); // what types are deduced for T and param?
我们在VS2019下 进行调试,发现param的类型被推断成了const char*,
因为在C语言中,数组形参都会被推断为指针
void Fun(int arr[100]);
这个就等同于int *arr
3. 接着我们把param改成引用
template<typename T>
void f(T& param); // template with by-reference parameter
f(name); // pass array to f
在VS2019下 param的类型是 const char[13]&
T的类型就是数组的真实类型 T is deduced to be const char [13]
书上说这 const char (&)[13]
我测试了一下
const char(& a)[13] = param;
可以运行 二者一致
4. 我们可以根据上述 来得出一个数组的大小
template <typename T, std::size_t N>
constexpr std::size_t ArraySize(T(&)[N])
{
return N;
}
cout << "Array Size " << ArraySize(name) << endl;