首页 > 编程语言 >c++模板的引用类型参数折叠问题解释

c++模板的引用类型参数折叠问题解释

时间:2023-05-27 17:55:59浏览次数:33  
标签:f1 const int 折叠 左值 c++ 引用 && 模板

template<typename T> void f1(T&);   

实参可以是左值、const类型的左值,不能是右值。

f1(i);   // 正确,i是int型,T是int

f1(c);  // 正确,i是const int 型,T是const int

f1(5);  // 错误

 

template<typename T> void f1(const T&);    

实参可以是左值、const类型的左值、右值。

f1(i);  // 正确,i是int型,T是int

f1(c);  // 正确,c是const int 型,T是int

f1(5);  // 正确,5是int&&,T是int

 

template<typename T> void f1(T&&);   

我们可能认为给这种情况传递一个左值给f1是不合法的,但实际上这是合法的,这种情况的实参可以是左值(或左值引用)(无论有无const)、右值(或右值引用)。

1. 当实参是右值(或右值引用)的时候,T被推断为X

f1(5);  // 正确,5是int&&型,T是 int

2. 例外规则①:当模板参数是右值(T&&)而实参是左值(或左值引用),也合法,此时T被推断为X&

f1(i);   // 正确,i是int型,按照上面的规则,T是 int&

 

第1种情况我们很容易理解,因为类型完全匹配。

对于第2种情况,根据例外规则①,把T代入,这个f1模板被实例化为 f1(int& &&) ,它的参数是引用的引用,那为啥我们实际传入的是 int& 咧?对于这种情况,实际上是c++有第2条例外规则:引用折叠。

例外规则②:引用折叠(当出现引用的引用类型变量时就会发生引用折叠)

X& &、X& &&、X&& & 这三种等价折叠为 X&

X&& && 等价折叠为 X&&

所以对于  f1(int& &&) ,它等价于 f1(int &),因此我们传入 int& 的实参是可以的。

标签:f1,const,int,折叠,左值,c++,引用,&&,模板
From: https://www.cnblogs.com/tan-wm/p/17437091.html

相关文章

  • C++学习目录
    C++学习目录第一章-C++介绍第二章-数据类型与运算第三章-选择与循环结构第四章-函数第五章-数组第六章-指针与引用第七章-数据结构第八章-面向对象第九章-类与对象的使用第十章-面向对象三大特点第十一章-输入输出流第十二章-异常处理与命......
  • java实现导入word模板导入试题
    ​ 最近有一个项目需要将一个word文档中的试题数据导入,并存储到数据库中。试题类型包括:单选题、多选题、判断题、填空题、简答题。支持图片导入(我的这篇是借鉴JAVA实现Excel、Word模板导入-JAVA-华仔部落,javapoi解析上传word试卷(题库管理系统)-爱码网)这两位大神的。废话......
  • Freemarker模板语法大全
    FreeMarker的插值有如下两种类型:1,通用插值${expr};2,数字格式化插值:#{expr}或#{expr;format}${book.name?if_exists}//用于判断如果存在,就输出这个值${book.name?default(‘xxx’)}//默认值xxx${book.name!"xxx"}//默认值xxx${book.date?string('yyyy-MM-dd')}//......
  • C++-double free or corruption(fasttop)
    C++-doublefreeorcorruption(fasttop)出现doublefreeorcorruption(fasttop)检查:delete,是否有重复delete隐式的复制构造函数导致析构次数增加全局变量,项目代码合并时,不同的共享库中出现同名的全局变量[本次问题的原因,修改新增的全局变量名称后fixed.]......
  • C++多线程
    多线程:thread_local每个线程都会有自己的一份数据,不会共享数据,避免竞争 volatile告诉编译器每次取数据都要从内存里取 使用情况:信号处理内存映射相关非本地跳转 std::atomic定义操作为原子操作,不可被线程分开 接口  std::shreadC++的线程类,但是不保证......
  • 软件测试职业生涯需要编写的全套文档模板,收藏这一篇就够了(附文档模板及视频)~
    作为一名测试工程师,在整个的职业生涯中,会涉及到各种不同类型的文档编写,大体包括如下:对应文档模板及文档编写视频如下:  一、测试岗位必备的文档在一个常规的软件测试流程中,会涉及到测试计划、测试方案、测试用例、测试报告的编写,这些文档也是软件测试岗位必须掌握的文档类......
  • 高精度模板
    xiayicheng的高精模板,可自取介绍各变量作用变量名作用\(len\)存储数字长度\(symbol\)存储数字符号,\(1\)为负,\(0\)为正\(s\)倒序存储数字功能\(^*\)变量赋值:\(\texttt{int,char,Bigint}\)比较大小:\(\texttt{Bigint}\)加减法:\(\texttt{Bigint}\)......
  • 所有背包问题模板
    01背包问题:无优化for(inti=1;i<=n;i++){for(intc=0;c<=m;c++){f[i][c]=f[i-1][c];if(c>=w[i])f[i][c]=max(f[i][c],f[i-1][c-w[i]]+v[i]);}}一维数组优化:for(inti=1;i<=n;i++){for(intc=m;c>=0;c--){......
  • 【模板】01背包问题
    一个在旅途中的长者有一个最多能用\(M\)公斤的背包,现在有\(n\)件物品,它们的重量分别是\(W1,W2,...,Wn\),它们的价值分别为\(C1,C2,...,Cn\).求旅行者能获得最大总价值。输入第1行:两个整数,\(M\)(背包容量,\(M\le200\))和\(n\)(物品数量,\(n\le30\));第\(2\)至\(n+1\)行:每行两个整数\(......
  • 【模型部署 01】C++实现分类模型(以GoogLeNet为例)在OpenCV DNN、ONNXRuntime、TensorRT
    深度学习领域常用的基于CPU/GPU的推理方式有OpenCVDNN、ONNXRuntime、TensorRT以及OpenVINO。这几种方式的推理过程可以统一用下图来概述。整体可分为模型初始化部分和推理部分,后者包括步骤2-5。以GoogLeNet模型为例,测得几种推理方式在推理部分的耗时如下:结论:GPU加速首选Tens......