模版实参推断和引用

2024-04-25 19:38
文章标签 引用 模版 推断 实参

本文主要是介绍模版实参推断和引用,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

模版参数推断包含函数指针及引用等部分,此处只介绍有关引用的模版参数推断。

考虑下面的例子:

template<typename T> void f(T &p);

其中函数参数p是一个模版类型参数T的引用,记住以下两点:

i、编译器会应用正常的引用绑定规则;

ii、const是底层的,不是顶层的。

1、从左值引用函数参数推断类型

当一个函数参数是模版类型参数的一个普通(左值)引用时(即,形如T&),绑定规则:只能传递给它一个左值(如,一个变量或一个返回引用类型的表达式)。实参可以是const类型,也可以不是。如果实参是const的,则T将被推断为const类型。

举例如下:

template<typename T> void f1(T&);//实参必须是一个左值
//对f1的调用使用实参所引用的类型作为模版参数类型
f1(i);//i是一个int;模版参数类型T是一个int
f1(ci);//ci是一个const int;模版参数T是const int
f1(5);//错误:传递给一个&参数的实参必须是一个左值

当一个函数参数的类型是const T&,正常的绑定规则:可以传递给它任何类型的实参——一个对象(const或非const)、一个临时对象或是一个字面常量值。

举例如下:

template<typename T> void f2(const T&);//实参可以是一个左值,也可以是一个右值
//对f1的调用使用实参所引用的类型作为模版参数类型
f2(i);//i是一个int;模版参数类型T是一个int
f2(ci);//ci是一个const int;模版参数T是int
f2(5);//一个const &参数可以绑定到一个右值;T是int

2、从右值引用函数参数推断类型

当一个函数参数是一个右值引用(即,形如T&&)时,正常绑定规则:可以传递给它一个右值。当传递右值时,类型推断过程类似普通左值引用函数参数的推断过程。

举例如下:

template<typename T> void f3(T&&);
f3(42);//实参是一个int类型的右值;模版参数T是int

3、规则例外:引用折叠和右值引用参数

个人总结:除遵循上述两条规则外,主要是&的折叠及右值引用的推断,其根据结果为导向推断T的实际类型,遵守的规则如下:

记X为给定类型,

i、X& &、X& &&和X&& &都折叠成类型X& 

ii、X&& &&折叠成X&&(给右值引用传递右值时,最后的的类型为X&&)(仅此折叠生成右值引用)

第3点例外规则导致如下几个重要结果:

a、如果一个函数参数是一个指向模板类型参数的右值引用(如,T&&),则它可以被绑定到一个左值;且(见b)

b、(接a)如果实参是一个左值,则推断出的模版实参类型将是一个左值引用,且函数参数将被实例化为一个(普通)左值引用参数(T&)

c、可以将任意类型的实参传递给T&&类型的函数参数。

举例如下:

template<typename T> void f3(T&&);
f3(i);//实参是一个左值;模版参数T是int&
f3(ci);//实参是一个左值;模版参数T是一个const int&
f3(42);//实参是一个右值;模版参数T是一个int

 

这篇关于模版实参推断和引用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/935612

相关文章

模版方法模式template method

学习笔记,原文链接 https://refactoringguru.cn/design-patterns/template-method 超类中定义了一个算法的框架, 允许子类在不修改结构的情况下重写算法的特定步骤。 上层接口有默认实现的方法和子类需要自己实现的方法

JavaSE(十三)——函数式编程(Lambda表达式、方法引用、Stream流)

函数式编程 函数式编程 是 Java 8 引入的一个重要特性,它允许开发者以函数作为一等公民(first-class citizens)的方式编程,即函数可以作为参数传递给其他函数,也可以作为返回值。 这极大地提高了代码的可读性、可维护性和复用性。函数式编程的核心概念包括高阶函数、Lambda 表达式、函数式接口、流(Streams)和 Optional 类等。 函数式编程的核心是Lambda

17 通过ref代替DOM用来获取元素和组件的引用

重点 ref :官网给出的解释是: ref: 用于注册对元素或子组件的引用。引用将在父组件的$refs 对象下注册。如果在普通DOM元素上使用,则引用将是该元素;如果在子组件上使用,则引用将是组件实例: <!-- vm.$refs.p will be the DOM node --><p ref="p">hello</p><!-- vm.$refs.child will be the c

【JAVA入门】Day35 - 方法引用

【JAVA入门】Day35 - 方法引用 文章目录 【JAVA入门】Day35 - 方法引用一、方法引用的分类1.引用静态方法2.引用成员方法2.1 引用其他类的成员方法2.2 引用本类和父类的成员方法2.3 引用构造方法2.4 使用类名引用成员方法2.5 引用数组的构造方法 二、方法引用的例题         方法引用就是“把已经有的方法当作函数式接口中抽象方法的方法

gcc 编译器对 sqrt 未定义的引用

man sqrt  Link with -lm. gcc -o test test.c -lm 原因:缺少某个库,用 -l 参数将库加入。Linux的库命名是一致的, 一般为 libxxx.so, 或 libxxx.a, libxxx.la, 要链接某个库就用   -lxxx,去掉头 lib 及 "." 后面的 so, la, a 等即可。 常见的库链接方法为

【JavaScript】基本数据类型与引用数据类型区别(及为什么String、Boolean、Number基本数据类型会有属性和方法?)

基本数据类型   JavaScript基本数据类型包括:undefined、null、number、boolean、string。基本数据类型是按值访问的,就是说我们可以操作保存在变量中的实际的值。 1)基本数据类型的值是不可变的 任何方法都无法改变一个基本类型的值,比如一个字符串: var name = "change";name.substr();//hangconsole.log

【python因果推断库11】工具变量回归与使用 pymc 验证工具变量4

目录  Wald 估计与简单控制回归的比较 CausalPy 和 多变量模型 感兴趣的系数 复杂化工具变量公式  Wald 估计与简单控制回归的比较 但现在我们可以将这个估计与仅包含教育作为控制变量的简单回归进行比较。 naive_reg_model, idata_reg = make_reg_model(covariate_df.assign(education=df[

FHQ Treap模版(luogu P3369)

FHQ Treap模版(自用),带注释 #include<bits/stdc++.h>using namespace std;const int N=1e5+10;int n,root,idx;struct node{int l,r;int val,key,size;}tr[N];int getnew(int v){tr[++idx].val=v;//权值tr[idx].key=rand(

被审稿人批得体无完肤?参考文献这样引用就对了!

我是娜姐 @迪娜学姐 ,一个SCI医学期刊编辑,探索用AI工具提效论文写作和发表。 审稿人对参考文献引用提出质疑,在comments中还挺常见的。一般来说,是最新的、相关的、重要的文献引用缺失。此外,如果仔细分析引文来源,娜姐还发现有些常见问题: 1 引用不全面。 比如,声称某药物有ABCD四个功能,但是引文只证明了ABC三个功能。 2 引用不准确。 引文中上升趋势是25%,但是你

CNN-LSTM模型中应用贝叶斯推断进行时间序列预测

这篇论文的标题是《在混合CNN-LSTM模型中应用贝叶斯推断进行时间序列预测》,作者是Thi-Lich Nghiem, Viet-Duc Le, Thi-Lan Le, Pierre Maréchal, Daniel Delahaye, Andrija Vidosavljevic。论文发表在2022年10月于越南富国岛举行的国际多媒体分析与模式识别会议(MAPR)上。 摘要部分提到,卷积