C++利用万能引用避免数组退化

C++利用万能引用避免数组退化

前言

\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

原因解释

待续

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值