【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;
相关推荐
天府之绝1 分钟前
uniapp 中使用uview表单验证时,自定义扩展的表单,在改变时无法触发表单验证处理;
开发语言·前端·javascript·vue.js·uni-app
紫色的路11 分钟前
TCP消息边界处理的精妙算法
c++·网络协议·tcp/ip·算法
萧鼎11 分钟前
深入解析 Python 的 Word 模板引擎:docxtpl 全面指南
开发语言·python·word
Chan1612 分钟前
场景题:如何设计一个分布式ID
java·开发语言·spring boot·java-ee·intellij-idea
chamu9918 分钟前
C++ 的可调用对象
开发语言·c++
tianyuanwo18 分钟前
Bash与Sh的诞生背景、底层原理及Linux多Shell解释器兼容性解析
linux·开发语言·bash
千里马-horse19 分钟前
Drawing a triangle -- setup -- Base code
c++·vulcan
txinyu的博客23 分钟前
unique_ptr shared_ptr weak_ptr的线程安全问题
c++·安全
怦怦蓝29 分钟前
IDEA 项目打印日志全攻略:从基础使用到高级配置
java·开发语言·debug
meichaoWen30 分钟前
【nodejs】nodejs的一些基础知识
开发语言·前端·javascript