1.函数模板类型推导中的特例
当函数模板中的参数param既不是引用也不是指针时,传递给模板函数的按值传递的数组参数会被退化为指针类型,这是合乎情理的
# include <iostream>
//由于数组退化成指针,所以调用此函数的实参类型const char *,依据模板
//类型推导的第三种情况,此时param类型为const char *
template <typename T>
void f(T param)
{
std::cout << param << std::endl;
}
int main()
{
char arr[] = "HelloWorld";
f(arr);
return 0;
}
这不难理解,但当函数模板中的参数为param为引用当如何呢?在下面例子中就是今天说明的函数模板的类型推导中的一个特例,如下函数模板形式参数的类型为const char(&)[13]或者const char[13]&即数组的引用
# include <iostream>
template <typename T>
void print(const T & arr)
{
std::cout << &arr << std::endl;//005AF974
std::cout << arr[2] << std::endl;//l
}
int main()
{
const char arr[] = "I lova china";
std::cout << &arr << std::endl;//005AF974
print(arr);
return 0;
}
2.数组引用做函数模板参数的一个简单例子
/*
# include <iostream>
# include <array>
// 在编译的时候返回数组的长度(数组引用参数没有名字,
// 因为只关心数组包含的元素的个数)
template<typename T, std::size_t N>
constexpr std::size_t arraySize(T (&)[N] ) noexcept
{
return N;
}
int main()
{
int arr []= {1,2,3,4,5,6};
std::array<int, arraySize(arr)> dyArray{100,200,300,400,500,600};
for (int x : dyArray)
{
std::cout << x << std::endl;
}
return 0;
}
我们再来看一个简单的例子来理解数组引用类型做函数参数。
#include <iostream>
using namespace std;
void printArr(const char (&arr)[11]) //char (&)[11]即为数组的引用类型
{
cout << sizeof(arr) << endl; //11
}
void printArr1(const char arr[])
{
cout << sizeof(arr) << endl; //4
}
int main()
{
char arr[] = "HelloWorld";
cout << sizeof(arr) << endl; //11
printArr(arr);
printArr1(arr);
return 0;
}
当然,当函数模板的泛化形参类型声明是一个引用但不是通用引用时,如果调用该函数时,实参是函数名,则该形参被推导为函数指针的引用。
网友评论