前言
\quad\quad
在C++
之中,数组与指针其实是不同的。这点可以通过<type_traits>
当中的is_pointer_v<>
这个模板变量进行验证。但是在当数组作为函数参数传递时,会“退化成”指针,很多时候带来了不便。一个解决办法是,使用C++11
引入的万能引用
加以克服。
具体代码
#include <iostream>
#include <type_traits>
template <typename T>
void func(T&& arr) {
// 首先使用`is_pointer_v`模板变量验证是否退化成指针
std::cout << std::boolalpha << std::is_pointer_v<decltype(arr)> << '\n';
// 其次通过关键词`typeid`通过RTTI来确定当前的具体类型名称
std::cout << typeid(arr).name() << '\n';
// 既然没有退化成指针,当然也可以通过`for range`的方式遍历数组
for (auto &&elem : arr) {
std::cout << elem << ' ';
}
std::cout << '\n';
}
int main(int argc, char const *argv[]) {
int arr[] = {1, 2, 3, 4, 5};
std::cout << "Before entering the func: " << typeid(arr).name() << '\n';
func(arr);
return 0;
}
\quad\quad
结果如下所示。可以看到,进入函数前后,数组的类型均为A5_i
,即长度为5的整型数组;通过is_pointer_v
的类型判断也是false
,说明未退化成指针;for range
的遍历循环操作也可正常进行。
Before entering the func: A5_i
false
A5_i
1 2 3 4 5
原因解释
待续