当前位置: 首页 > backend >正文

《C++ Templates》:有关const、引用、指针的一些函数模板实参推导的例子

1.T按值传递

最简单的模板例子:

template<typename T>
void func(T x) {std::cout << typeid(T).name() << std::endl;x = 20;cout << x;
}

这种情况下,T永远不会被推导成带顶层const或引用的类型

【顶层const即变量本身不能被修改,例如const int和const int &都是变量本身不能被修改的情况】

这种情况,T是int类型

int a = 10;
int& b = a;
func(b);

这种情况,T还是int类型

int a = 10;
const int& p = a;
func(p);

这种情况,T还是int类型

const int a = 10;
func(a);

这种情况,T是int *

int* p = nullptr;
func(p);

而这种情况,T还是int * (因为int *const p的意思是p是一个指向int类型的指针,而且指针p的值不能改变,故该const是顶层const)

int *const p = nullptr;
func(p);

而底层const会被保留

【底层const即变量指向的内容不能被修改,典型例子是const int *p=&a,变量p的const就是底层const】

故这种情况下T是const int *(int const *)类型

template<typename T>
void func(T x) {std::cout << typeid(T).name() << std::endl;
}
int main()
{const int *a =nullptr;func(a);
}

顺便提一下,这种情况T依然是const int *,因为T是不会推导出引用的

const int* a = nullptr;
const int *&p =a;
func(p);

2.T &

T 仍然不会是引用

但是T会保留顶层const

 func函数如下

#include <type_traits>
using namespace std;
template<typename T>
void func(T &x) {if (std::is_reference<T>::value) {//可以判断T是否是引用类型std::cout << "T is a reference type." << std::endl;}else {std::cout << "T is not a reference type." << std::endl;}std::cout << typeid(T).name() << std::endl;//即使T真是int &,typeid(T).name()也只会输出int,所以要上面的判断帮忙x = 20;cout << x << endl;
}

T是int;x的类型是int &,运行过后a的值也是20;

int a = 10;
int& b = a;
func(b);

T是const int;x的类型是const int &

template<typename T>
void func(T &x) {if (std::is_reference<T>::value) {std::cout << "T is a reference type." << std::endl;}else {std::cout << "T is not a reference type." << std::endl;}if (std::is_const<T>::value) {//检测conststd::cout << "T is a const type." << std::endl;}else {std::cout << "T is not a const type." << std::endl;}std::cout << typeid(T).name() << std::endl;//x = 20;由于x是const int &,不可以给x赋值cout << x << endl;
}
int a=10;
const int& b = a;
func(b);

http://www.xdnf.cn/news/4537.html

相关文章:

  • Ubuntu 安装 Keepalived
  • Linux 系统的进阶指令详解
  • 【软件设计师:算法】3.排序算法
  • 微信小程序pinia的应用
  • 对redis的深入了解
  • 【每日刷题】第2天
  • 互联网大厂Java求职面试:AI集成与云原生架构设计
  • Go 面向对象,封装、继承、多态
  • 拆解 Prompt 工程:五大场景驱动 DeepSeek 超越 ChatGPT
  • AUTOSAR图解==>AUTOSAR_SWS_WirelessEthernetTransceiverDriver
  • 【AI入门】CherryStudio入门3:结合FastMCP创建自己的MCP服务,实现哔哩视频查询
  • 梅特卡夫法则——AI与思维模型【97】
  • 单片机-STM32部分:7、GPIO输入 按键
  • ()初始化 和 { }初始化
  • PostgreSQL中“参数默认值实现伪重载“详解
  • Unable to ping server at localhost:1099解决
  • 【Linux庖丁解牛】—程序地址空间【进程地址空间 | 虚拟地址空间】
  • 每日一题洛谷P1025 [NOIP 2001 提高组] 数的划分c++
  • Python打卡 DAY 18
  • MySQL核心机制:日志系统、锁机制与事务管理的深度剖析
  • 六个仓库合并为一个仓库,保留master和develop分支的bat脚本
  • llama-Factory不宜直接挂接Ollama的大模型
  • 互联网大厂Java求职面试:分布式系统中向量数据库与AI应用的融合探索
  • FastDFS,分布式文件存储系统,介绍+配置+工具类
  • upload-labs靶场通关详解:第一关
  • 远程访问代理+内网穿透:火山引擎边缘网关助力自部署模型公网调用与全链路管控
  • 阿维塔汽车CAN总线数据适配技术解析与免破线数据采集实践
  • 模型中台建设全流程指南
  • [逆向工程]什么是 Process Explorer
  • 智慧系统搭建平台有哪些?2025智慧系统搭建平台推荐?智慧系统搭建平台TOP10全面解析