随笔分类 - c++ / c++11
摘要:c++在c++11标准中引入了lambda表达式,一般用于定义匿名函数,使得代码更加灵活简洁。lambda表达式与普通函数类似,也有参数列表、返回值类型和函数体,只是它的定义方式更简洁,并且可以在函数内部定义。 什么是Lambda表达式 最常见的lambda的表达式写法如下 auto plus =
阅读全文
摘要:lambda 表达式是 C++11 最重要也最常用的一个特性之一,C# 3.5 和 Java 8 中就引入了 lambda 表达式。 lambda 来源于函数式编程的概念,也是现代编程语言的一个特点。C++11 这次终于把 lambda 加进来了。 lambda表达式有如下优点: 声明式编程风格:就
阅读全文
摘要:Lambda 表达式(Lambda Expression)是 C++11 引入的一个“语法糖”,可以方便快捷地创建一个“函数对象”。 从 C++11 开始,C++ 有三种方式可以创建/传递一个可以被调用的对象: 函数指针 仿函数(Functor) Lambda 表达式 函数指针 函数指针是从 C 语
阅读全文
摘要:1. 可调用对象 在C++中存在“可调用对象”这么一个概念。准确来说,可调用对象有如下几种定义: 是一个函数指针 1 2 3 4 5 6 7 int print(int a, double b) { cout << a << b << endl; return 0; } // 定义函数指针 int
阅读全文
摘要:可调用对象的几种定义 是一个函数指针 是一个具有operator()成员函数的类的对象; 可被转换成函数指针的类对象; 一个类成员函数指针; C++中可调用对象的虽然都有一个比较统一的操作形式,但是定义方法五花八门,这样就导致使用统一的方式保存可调用对象或者传递可调用对象时,会十分繁琐。C++11中
阅读全文
摘要:文章目录为什么需要函数包装器函数包装器bind调整可调用类型的参数为什么需要函数包装器function函数包装器也叫适配器,在C++中其本质是一个类模板。 由于C++的历史遗留问题,导致如果想实现一个函数功能,可以采用函数名、函数指针、仿函数、有名称的lambda表达式,所有这些都是可调用的类型。它
阅读全文
摘要:前言如果你还不知道 C++ 11 引入的包装器和绑定器是什么,可以读读这篇文章,看看有什么 启发;如果你已经对包装器和绑定器了如指掌,也可以读读这篇文章,看看有什么 补充。欢迎交流~😏 可调用对象C++中存在【可调用对象】这样一个概念。即对于一个对象或一个表达式,如果可以对其使用调用运算符(),则
阅读全文
摘要:C++ 包装器 1 简介 包装器用于给其他编程接口提供更一致或更合适的接口。 模板bind可替代bind1st和bind2nd,且更灵活 模板mem_fn让您能够将成员函数作为常规函数进行传递 模板reference_wrapper让您能够创建像引用但可被复制的对象 包装器function让您能够以
阅读全文
摘要:override 关键字 作用:在成员函数声明或定义中, override 确保该函数为虚函数并覆写来自基类的虚函数。 位置:函数调用运算符之后,函数体或纯虚函数标识 “= 0” 之前。 使用以后有以下好处: 1.可以当注释用,方便阅读 2.告诉阅读你代码的人,这是方法的复写 3.编译器可以给你验证
阅读全文
摘要:本文介绍了C++ override关键字使用详解以及与重载的区别。 C++ override关键字使用详解一、override作用二、override在基类与派生类的应用2.1. 纯虚函数2.2. 普通虚函数2.3.Override重写三、Override实例四、C++中重载(overload)与覆
阅读全文
摘要: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
阅读全文
摘要:引用引用就好像存储数据的一块内存区域(变量)的一个名字,定义引用就好像声明了一个变量名并把它绑定到已存在的变量上,变量名附带属性(包括但不限于类型、存储期),变量名附带的属性由声明变量名时使用的声明指定符决定。需要注意的是,用于声明左值引用的 & 和用于声明右值引用的 && 不属于声明指定符,它们是
阅读全文