摘要: 环境:mac os + xcode 一、背景 作为c++程序员,相信我们都写过如下代码: void fun(int &x){} int main(int argc, const char * argv[]) { // insert code here... fun(10); return 0; } 阅读全文
posted @ 2023-04-27 16:26 imxiangzi 阅读(65) 评论(0) 推荐(0) 编辑
摘要: 目录 一、引用折叠 二、示例解析 三、参考: 一、引用折叠 由于存在T&&这种万能引用类型,当它作为参数时,有可能被一个左值引用或右值引用的参数初始化,这是经过类型推导的T&&类型,相比右值引用(&&)会发生类型的变化,这种变化就称为引用折叠。 1.所有右值引用折叠到右值引用上仍然是一个右值引用。( 阅读全文
posted @ 2023-04-27 16:15 imxiangzi 阅读(338) 评论(0) 推荐(0) 编辑
摘要: 理解引用折叠 以下面这个模板为例 template<typename T> void func(T&& param); 1 2 模板形参T的推导类型中,会把传给param的实参是左值还是右值的信息给编码进去。 编码机制是直截了当的:如果传递的实参是个左值,T的推导结果就是个左值引用类型;如果传递的实 阅读全文
posted @ 2023-04-27 16:14 imxiangzi 阅读(40) 评论(0) 推荐(0) 编辑
摘要: 左值和右值左值:指表达式结束后依然存在的持久对象,可以取地址,具名变量或对象右值:表达式结束后就不再存在的临时对象,不可以取地址,没有名字。比如 int a = b + c;,a 就是一个左值,可以对a取地址,而b+c 就是一个右值,对表达式b+c 取地址会报错。C++11中右值又由两个概念组成:将 阅读全文
posted @ 2023-04-27 16:11 imxiangzi 阅读(137) 评论(0) 推荐(0) 编辑
摘要: 1. 引用折叠规则 如果间接的创建一个引用的引用,则这些引用就会“折叠”(空格前为模板T类型)。 X& &、X& &&、X&& &都折叠成X& X&& &&折叠为X&& 当将一个左值传递给一个参数是右值引用指向模板类型参数(T&&)时,编译器推断模板参数类型为实参的左值引用 template<typ 阅读全文
posted @ 2023-04-27 15:28 imxiangzi 阅读(340) 评论(0) 推荐(0) 编辑
摘要: 引用引用就好像存储数据的一块内存区域(变量)的一个名字,定义引用就好像声明了一个变量名并把它绑定到已存在的变量上,变量名附带属性(包括但不限于类型、存储期),变量名附带的属性由声明变量名时使用的声明指定符决定。需要注意的是,用于声明左值引用的 & 和用于声明右值引用的 && 不属于声明指定符,它们是 阅读全文
posted @ 2023-04-27 15:25 imxiangzi 阅读(752) 评论(0) 推荐(0) 编辑