04 2023 档案
摘要:C++11 标准为 C++ 引入右值引用语法的同时,还解决了一个 C++ 98/03 标准长期存在的短板,即使用简单的方式即可在函数模板中实现参数的完美转发。那么,什么是完美转发?它为什么是 C++98/03 标准存在的一个短板?C++11 标准又是如何为 C++ 弥补这一短板的?别急,本节将就这些
阅读全文
摘要:目录 1、不完美转发 2、完美转发 2.1、引用折叠 2.2、std::forward 1、不完美转发所谓完美转发,是指在函数模板中,完全按照模板的参数的类型,将参数传递给函数模板中调用的另一个函数。比如: template <typename T>void IamForwording(T t){
阅读全文
摘要:不管是T&&、左值引用、右值引用,std::forward都会按照原来的类型完美转发。 forward主要解决引用函数参数为右值时,传进来之后有了变量名就变成了左值。 #include <QCoreApplication> #include <memory> #include <iostream>
阅读全文
摘要:首先先描述一下C++中各种类型的值(以下无特殊说明“类型”皆按如下分法)lvalue(left value)左值:有标识符,且不能被回收rvalue(right value)右值:有无标识符皆可,可以被回收glvalue(generalized left value)泛左值:有标识符,可不可被回收皆
阅读全文
摘要:环境:mac os + xcode 一、背景 作为c++程序员,相信我们都写过如下代码: void fun(int &x){} int main(int argc, const char * argv[]) { // insert code here... fun(10); return 0; }
阅读全文
摘要:目录 一、引用折叠 二、示例解析 三、参考: 一、引用折叠 由于存在T&&这种万能引用类型,当它作为参数时,有可能被一个左值引用或右值引用的参数初始化,这是经过类型推导的T&&类型,相比右值引用(&&)会发生类型的变化,这种变化就称为引用折叠。 1.所有右值引用折叠到右值引用上仍然是一个右值引用。(
阅读全文
摘要:理解引用折叠 以下面这个模板为例 template<typename T> void func(T&& param); 1 2 模板形参T的推导类型中,会把传给param的实参是左值还是右值的信息给编码进去。 编码机制是直截了当的:如果传递的实参是个左值,T的推导结果就是个左值引用类型;如果传递的实
阅读全文
摘要:左值和右值左值:指表达式结束后依然存在的持久对象,可以取地址,具名变量或对象右值:表达式结束后就不再存在的临时对象,不可以取地址,没有名字。比如 int a = b + c;,a 就是一个左值,可以对a取地址,而b+c 就是一个右值,对表达式b+c 取地址会报错。C++11中右值又由两个概念组成:将
阅读全文
摘要:1. 引用折叠规则 如果间接的创建一个引用的引用,则这些引用就会“折叠”(空格前为模板T类型)。 X& &、X& &&、X&& &都折叠成X& X&& &&折叠为X&& 当将一个左值传递给一个参数是右值引用指向模板类型参数(T&&)时,编译器推断模板参数类型为实参的左值引用 template<typ
阅读全文
摘要:引用引用就好像存储数据的一块内存区域(变量)的一个名字,定义引用就好像声明了一个变量名并把它绑定到已存在的变量上,变量名附带属性(包括但不限于类型、存储期),变量名附带的属性由声明变量名时使用的声明指定符决定。需要注意的是,用于声明左值引用的 & 和用于声明右值引用的 && 不属于声明指定符,它们是
阅读全文
摘要:文章目录左值和右值什么是左值和右值?举例说明程序分析左值引用和右值引用什么是左值引用和右值引用?左值引用右值引用 (important!!!)左值和右值的转换左值变右值右值变左值左值和右值什么是左值和右值?按照我们常规理解左值就是在等号左边的值,右值是等号右边的值。如果你要这么理解,你就会发现遇到+
阅读全文
摘要:本文topics 什么是左值和右值什么是左值表达式、右值表达式引用的分类之前学习Java的时候只记得在赋值表达式左边的就是左值,右边的就是右值。这个说法没有错,但今天又在C++中有学习到了关于左右值得概念,在此梳理了一些这些知识点。 左值和右值左值:左值是一个对象或变量,可以代表着一个固定地址。 i
阅读全文
摘要:不使用 std::forward时,下述代码G不管传入什么类型的参数,只会最终调用 void F(int& a); using namespace std; void F(int& a) { cout << "int& version " <<a <<endl; } void F(int&& a)
阅读全文
摘要:extern “C” extern 是C/C++ 语言中表明函数和全局变量作用范围的关键字,该关键字告诉编译器,其声明的函数和变量可以在本模块或其它模块中使用。 被extern "C" 修饰的变量和函数是按照C语言方式编译和连接的。 extern “C” 这个声明的真实目的:解决名字匹配问题,实现C
阅读全文