C++编程之 万能引用
创始人
2025-05-28 21:14:13
0

万能引用是一种可以同时接受左值或右值的引用,它的形式是T&&,其中T是一个模板参数。万能引用不是C++的一个新特性,而是利用了模板类型推导引用折叠的规则来实现的功能。

模板类型推导

模板类型推导是指在调用一个模板函数时,编译器会根据传入的实参来推导出模板参数的类型。例如:

template
void f(T t) {}int x = 10; // x 是左值
f(x); // 调用f时,T被推导为int(注意而不是int&)
f(20); // 调用f时,T被推导为int

之所以调用f(x)时,T被推导为int,这是因为如果实参是一个左值,那么它会被当作一个右值来处理,除非模板参数的形式是T&或者T&&。例如:

template
void h(T t) {}template
void i(T& t) {}template
void j(T&& t) {}int x = 10; // x 是左值
h(x); // 调用h时,T被推导为int
i(x); // 调用i时,T被推导为int
j(x); // 调用j时,T被推导为int&

你可以看到,在调用h和i时,T都被推导为int,而在调用j时,T才被推导为int&。这是因为在j的模板参数中使用了&&符号,这样就触发了万能引用的机制。

当模板参数的形式为T&的时候:

template
void k(T& t) {}int x = 10; // x 是左值
k(x); // 调用k时,T被推导为int
k(20); // 调用k时,编译错误,因为不能把右值绑定到非常量左值引用上

你可以看到,在调用k时,如果传入一个右值,就会发生编译错误。这是因为右值是临时的,不能被修改或者延长其生命周期。如果想要让模板函数接受右值,可以使用常量左值引用或者右值引用作为模板参数的形式。

引用折叠

引用折叠是指在定义一个引用类型时,如果它本身就是一个引用类型,那么会发生如下的转换:

  • 左值引用& + 左值引用& = 左值引用&
  • 右值引用&& + 右值引用&& = 右值引用&&
  • 左值引用& + 右值引用&& = 左值引用&
  • 右值引用&& + 左值引用& = 左值引用&

例如:

int x = 10; // x 是左值
int &r1 = x; // r1 是左值引用
int &&r2 = 20; // r2 是右值引用// 引入了两个别名类型:
using LRef = int &;
using RRef = int &&;LRef &r3 = r1; // r3 的类型是 LRef &,即 int & &,经过折叠后变为 int &
RRef &&r4 = r2; // r4 的类型是 RRef &&,即 int && &&,经过折叠后变为 int &&
LRef &r5 = r2; // r5 的类型是 LRef &,即 int & &&,经过折叠后变为 int &
RRef &&r6 = r1; // r6 的类型是 RRef &&,即 int && &,经过折叠后变为 int &

结合这两个规则,我们就可以理解万能引用的工作原理。例如:

template
void g(T&& t) {}int x = 10; // x 是左值
g(x); // 调用g时,T被推导为int&(注意不是int),因此t的类型是int& &&// 经过折叠后变为int&(左值)
g(20); // 调用g时,T被推导为int(注意不是int&),因此t的类型是int &&// 经过折叠后仍然是int&&(右值)

你可以看到,在调用g时,t既可以绑定到左值上也可以绑定到右值上,并且保持了原来实参的属性。这就实现了万能引用。

相关内容

热门资讯

安卓系统的电脑有哪些,探索安卓... 你有没有想过,电脑的世界里竟然也能找到安卓系统的身影?没错,就是那个我们手机上熟悉的安卓系统,现在竟...
安卓系统返回键换位置,返回键位... 你有没有发现,手机里的安卓系统有时候会给你来个小惊喜呢?比如,那个我们每天都要按的返回键,它竟然悄悄...
苹果的安卓系统怎么下载,苹果i... 你有没有想过,为什么你的手机里会有那么多好玩的应用?其实,这一切都离不开那个神奇的操作系统——安卓。...
安卓系统固件结构有哪些,从底层... 你有没有想过,你的安卓手机里那些神秘的固件结构到底是个啥样子?别急,今天我就来给你揭开这个神秘的面纱...
安卓平板专用系统怎么用,畅享智... 你手里那款安卓平板是不是一直闲置着,感觉有点浪费了呢?别急,今天就来给你详细介绍一下安卓平板专用系统...
安卓系统受限怎么办,安卓系统受... 手机里的安卓系统突然受限了,是不是让你感觉像是被锁在了密室里,找不到出口呢?别急,今天就来给你支几招...
亿程gps监控系统安卓,安全护... 你有没有想过,一辆车在行驶过程中,就像一个移动的“黑匣子”,记录着它的每一步?今天,就让我带你走进亿...
安卓手机刷机深度系统,安卓手机... 你有没有想过,你的安卓手机其实还有隐藏的潜能?没错,就是刷机!刷机,这个词听起来可能有点高大上,但其...
安卓设备怎样改定位系统,安卓设... 你是不是也和我一样,在使用安卓设备时,总是觉得定位系统不够精准呢?别急,今天就来手把手教你如何改定位...
如何从安卓系统变成window... 你有没有想过,你的手机从安卓系统换成Windows系统,会是怎样的体验呢?想象你手中的设备,从那个熟...
安卓12系统界面小组件,界面小... 你有没有发现,最近你的安卓手机是不是变得更有活力了呢?没错,就是那个神秘的安卓12系统,它悄悄地给我...
安卓系统tv版软件,体验升级 你有没有发现,家里的电视已经不再只是用来看电视节目那么简单了?现在,它可是个全能的小助手呢!而这一切...
安卓怎么调系统小游戏,轻松实现... 你有没有发现,安卓手机里的小游戏真是让人欲罢不能呢?有时候,我们可能觉得系统自带的小游戏不够玩,或者...
安卓root系统升级,提升系统... 你有没有发现,你的安卓手机最近是不是有点儿“不听话”了?别急,别急,让我来给你揭秘一下安卓root系...
三星安卓系统前景,引领未来智能... 你有没有想过,手机界的巨头三星,它的安卓系统未来会怎样呢?想象你手中的三星手机,是不是已经成为了你生...
大厨图片推荐安卓系统版,大厨图... 你有没有想过,一张大厨的图片就能让你的烹饪技能瞬间提升?没错,就是那种让人一看就忍不住想要动手一试的...
安卓系统用哪个云台,基于安卓系... 你有没有想过,你的安卓手机里那些珍贵的照片和视频,如果有一天不小心丢失了,那可怎么办呢?别担心,今天...
安卓系统能安装探探吗,畅享社交... 你有没有想过,在安卓手机上安装探探这种社交软件呢?探探可是个超级火的交友神器,但是,安卓系统能不能安...
安卓系统稳定性对比,全面对比与... 你有没有发现,手机里的安卓系统和苹果的iOS系统就像是两个性格迥异的好友,各有各的“脾气”呢?今天,...
安卓系统后台进程限制,安卓系统... 你有没有发现,手机用久了,后台进程越来越多,有时候甚至感觉手机都要“喘不过气”了?别急,今天就来聊聊...