【Effective Modern C++】条款24:区分万能引用和右值引用

条款24:区分万能引用和右值引用

万能引用既可以是左值引用,也可以是右值引用。

一、模板中的万能引用

要求:T && + 类型推导。

cpp 复制代码
template<typename T>
void f(T &&param);   // param是一个万能引用

template<typename T>
void f(std::vector<T> &&param);  // 右值引用,因为不是形如 T &&

// std::vector内的push_back成员函数
void push_back(T &&x); // 右值引用,因为不涉及类型推导,vector实例的类型已经确定了push_back的参数类型

用左值初始化万能引用就会得到一个左值引用,用右值初始化万能引用就会得到一个右值引用。

二、可变参数模板的万能引用

要求:Args&&... + 类型推导

cpp 复制代码
// std::vector的emplace_back
template<class... Args>
void emplace_back(Args&&... args); 
// 万能引用,因为类型形参Args独立于vector的类型形参T,每次emplace_back的时候都要进行推导

三、auto的万能引用

要求:auto&&/auto&&... + 类型推导

cpp 复制代码
auto &&var2 = var1;
相关推荐
数聚天成DeepSData14 分钟前
企业知识库 RAG 数据准备与文档清洗:Dify、RAGFlow、扣子选型指南
开发语言·人工智能·机器学习·自然语言处理·sentinel·cocos2d
我是唐青枫14 分钟前
Java SLF4J 实战指南:从日志门面到 Logback、MDC 和链路追踪
java·开发语言·logback
aramae17 分钟前
C++11:现代C++的里程碑
c语言·开发语言·c++·windows·git·后端
weixin_4467291638 分钟前
java实现发送邮件
java·开发语言
米尔的可达鸭1 小时前
深入操作系统 Socket 底层:EPOLLOUT 可写事件管理 + 非阻塞异步
开发语言·网络·数据结构·经验分享·websocket·网络协议
前端进阶之旅1 小时前
Next.js 16.3 新特性全解析 AI 驱动开发与 Instant Navigations 实战指南
开发语言·javascript·人工智能
小小编程路1 小时前
Java super 关键字详解:用法、场景与常见误区
java·开发语言
薛定猫AI1 小时前
【技术干货】大模型检查点可靠性评测:基于 Python 构建幻觉与指令遵循测试
开发语言·python
文祐2 小时前
C语言利用数组计算矩阵乘法
c语言·开发语言·矩阵
啦啦啦啦啦zzzz2 小时前
c++web服务器框架Oat++的API应用
服务器·c++·oat++