ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

c++11终章

c++11终章 一.lambda1.lambda的语法①.定义lambda表达式是一个匿名函数对象跟普通函数只能定义在全局或者类里不同它能够定义在函数的内部。②.类型lambda表达式在使用层而言没有类型一般用auto或者模板参数定义的对象去接收lambda对象。③.lambda的格式表达式格式跟普通函数相比少了函数名(匿名)多了捕捉列表。一个小示例注此处修正一下,返回值部分是“-返回值类型”。没有返回值可以不写。2.lambda的用途从图中可看出利用lambda写出的控制升降序的可读性大大提升。3.capture-list(捕捉列表)重点3-1.用法lambda能够直接使用全局域或者lambda局部域内的变量要想使用其他局部域的变量需要借助捕捉列表。注意同一个变量不能被同时捕捉两次3-2.分类捕捉分为三个大类显示捕捉和隐式捕捉以及混合使用显示和隐式捕捉。3-3.显示捕捉①.其中显示捕捉可分为值捕捉和引用捕捉。②.引用捕捉的引用有些特殊不需要变量的类型只需要一个“变量就行了。③.由于值捕捉过来的变量是被const修饰的因此无法修改而引用捕捉过来的变量可以修改。但实在要修改值捕捉的变量可以在函数体前添加一个关键字——mutable取消const:不过由于是传值捕捉变量在类域内大小改变但出了类域变量大小不变。④.引用捕捉到的变量在类域内修改后其在类域外变量的大小也会改变因为捕捉到的是个引用是个别名。3-4.隐式捕捉①.隐式捕捉仍旧分成隐式值捕捉和隐式引用捕捉。②.隐式值捕捉示例③.隐式引用捕捉示例3-5.混合使用显示和隐式捕捉形式Ⅰ.个别(a,b)显示传值其他全为引用捕捉因此用上隐式传引用自动捕捉c,d形式Ⅱ.个别传值引用捕捉其余全是传值因此用上隐式传值捕捉自动捕捉c,d:4.lambda的原理①.其原理与范围for相似二者都属于上层的东西在汇编层面根本就没有范围for和lambda的说法lambda的底层是个仿函数对象写一个lambda后编译器会自动生成一个对应仿函数的类。②.并且类名由编译器决定,下面蓝色区域就是类名由lambda后面uuid(一串字符串)组成,是独一无二的。③.lambda的参数返回值类型和函数体就是其对应仿函数中operator()的参数返回值类型和函数体。而捕捉列表是仿函数类的成员变量。二.包装器1.function①.定义注意使用function的时候要包含头文件functional②.格式③.意义统一可调用对象的类型。所谓统一类型其实是将不同类型的可调用对象分别作为不同function的成员经过这样的封装以后暴露出的类型全是function类型。由图可知f,Functor(),lambda这三个可调用对象的类型必然是不同的要想同一类型就用function,包装后的f1,f2,f3的类型是相同的。④.包装成员函数Ⅰ.需要指定类域Ⅱ.非静态成员函数还必须在类域前加(取地址)操作符静态的可加可不加,建议也加上。Ⅲ.但即便有了取地址操作符还是会报错这是什么原因原因在于非静态成员函数的参数里还有隐藏的this指针所以包装时还需要在可变参数模板里加上对象或者对象的指针2.bind①.定义②.作用Ⅰ.调整参数顺序(意义不大)Ⅱ.调整参数个数注意:_n代表第n个实参因此sub6第三个参数是_2的1而不是_3三.类的新功能1.默认移动构造和移动赋值c11增加了两个默认成员函数即默认移动构造和移动赋值。这俩玩意在笔者c11(二)里的第2节和c11(一)的第6节都提过一嘴这里还剩下部分内容。触发系统自动生成移动构造和移动赋值的条件2.default和delete3.新容器4.新接口
返回列表