首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

【C++】C++11(lambda、可变参数模板、包装器、线程库)

lambda表达式实际上可以理解为无名函数,该函数无法直接调用,如果想要直接调用,可借助auto将其赋值给一个变量。 lambda表达式的定义是一个局部的匿名对象。...递归函数方式展开参数包 我们无法直接获取参数包args中的每个参数, 只能通过展开参数包的方式来获取参数包中的每个参数。...同时,使用std::bind函数还可以实现参数顺序调整等操作。 可以将bind函数看作是一个通用的函数适配器,它接受一个可调用对象,生成一个新的可调用对 象来“适应”原对象的参数列表。...如果想要通过形参改变外部实参时,必须借助std::ref()函数,强行把中间的拷贝变成引用拷贝。 注意:如果是类成员函数作为线程参数时,必须将this作为线程函数参数。...注意:原子类型通常属于"资源型"数据,多个线程只能访问单个原子类型的拷贝,因此在C++11 中,原子类型只能从其模板参数中进行构造,不允许原子类型进行拷贝构造、移动构造以及 operator=等,为了防止意外

12610

C++11新特性学习笔记

函数体内可以使用lambda所在类中的成员变量。 n a。将a按值进行传递。按值进行传递时,函数体内不能修改传递进来的a的拷贝,因为默认情况下函数是const的。...要修改传递进来的a的拷贝,可以添加mutable修饰符。 n &a。将a按引用进行传递。 n a, &b。将a按值进行传递,b按引用进行传递。 n =,&a, &b。...除去在语法层面上的不同,lambda和仿函数有着相同的内涵——都可以捕获一些变量作为初始化状态,并接受参数进行运行。...\n”; return 0; } 如果不希望线程被阻塞执行,可以调用线程的std::thread::detach,将线程和线程对象分离,让线程作为后台线程去执行。...如果我们在多个线程中对这些类型的共享资源进行操作,编译器将保证这些操作都是原子性的,也就是说,确保任意时刻只有一个线程对这个资源进行访问,编译器将保证多个线程访问这个共享资源的正确性。

2.2K20
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    C++11知识点总结(全面解析C++11经常考到的知识点)

    C++11对右值进行了严格的区分: C语言中的纯右值,比如:a+b, 100 将亡值。比如:表达式的中间结果、函数按照值的方式进行返回。...9.7 完美转发 完美转发是指在函数模板中,完全依照模板的参数的类型,将参数传递给函数模板中调用的另外一个函数。...lambda表达式实际上可以理解为无名函数,该函数无法直接调用,如果想要直接调用,可借助auto将其赋值给一个变量。...函数对象将rate作为其成员变量,在定义对象时给出初始值即可,lambda表达式通过捕获列表可以直接将该变量捕获到。 ?...注意:如果是类成员函数作为线程参数时,必须将this作为线程函数参数。 11.3 join与detach 启动了一个线程后,当这个线程结束的时候,如何去回收线程所使用的资源呢?

    2.1K10

    Effective Modern C++翻译(1):序言

    这本书里的信息被分割为一条一条的条款,想要明白类型推导的各种形式?想要知道什么时候应该(什么时候不应该)把一个对象声明为auto?对为什么const成员函数应该是线程安全的感兴趣?...lambda表达式(指的C++11和C++14),C++14提供了更普遍的函数返回类型的推导(指的仅仅是C++14)。...),在这两个例子中, 形参都是w,形参和实参的区别是很重要的,因为形参是左值,但是实参和实例化这些实参的却可能是左值或是右值,这个和完美转发(perfect forwarding)的过程相关,完美转发是指将参数传递给函数中调用的第二个函数...,原来参数的左值和右值性得以保留(完美转发的更多细节将在条款32中进行讨论)。...我使用术语可调用物(callable entity)来描述可以和调用非成员函数一样的调用语法的任何东西,比如,语法“functionName(arguments)“,函数,函数指针,函数对象都是可调用物

    1.2K90

    C++11新特性学习笔记

    函数体内可以使用lambda所在类中的成员变量。 n a。将a按值进行传递。按值进行传递时,函数体内不能修改传递进来的a的拷贝,因为默认情况下函数是const的。...要修改传递进来的a的拷贝,可以添加mutable修饰符。 n &a。将a按引用进行传递。 n a, &b。将a按值进行传递,b按引用进行传递。 n =,&a, &b。...除去在语法层面上的不同,lambda和仿函数有着相同的内涵——都可以捕获一些变量作为初始化状态,并接受参数进行运行。...\n”; return 0; } 如果不希望线程被阻塞执行,可以调用线程的std::thread::detach,将线程和线程对象分离,让线程作为后台线程去执行。...如果我们在多个线程中对这些类型的共享资源进行操作,编译器将保证这些操作都是原子性的,也就是说,确保任意时刻只有一个线程对这个资源进行访问,编译器将保证多个线程访问这个共享资源的正确性。

    2.1K20

    C++11的简单介绍(下)

    注意: 在lambda函数定义中,参数列表和返回值类型都是可选部分,而捕捉列表和函数体可以为空。因此C++11中最简单的lambda函数为:[]{}; 该lambda函数不能做任何事情。...表达式实际上可以理解为无名函数,该函数无法直接调用,如果想要直接调用,可借助auto将其赋值给一个变量。...函数对象将rate作为其成员变量,在定义对象时给出初始值即可,lambda表达式通过捕获列表可以直接将该变量捕获到。...Args> bind (Fn&& fn, Args&&... args); 可以将bind函数看作是一个通用的函数适配器,它接受一个可调用对象,生成一个新的可调用对象来“适应”原对象的参数列表。...t3.join(); cout << a << endl; return 0; } 注意:如果是类成员函数作为线程参数时,必须将this作为线程函数参数。

    9910

    C++11-lambda表达式包装器线程库

    ,编译器根据[]来判断接下来的代码是否为lambda函数,捕捉列表能够捕捉上下文中的变量供lambda函数使用 (parameters): 参数列表,与普通函数的参数列表一致,如果不需要参数传递,...lambda表达式完全一样:函数对象将rate作为其成员变量,在定义对象时给出初始值即可,lambda表达式通过捕获列表可以直接将该变量捕获到 示图: 注:实际在底层编译器对于lambda表达式的处理方式...; return 0; } 效果: 总结: bind是对包装的可调用类型的进一步封装,可以根据自己的需要进行调整参数的数据及位置,绑定类对象能有优化成员函数的包装使用,更加符合使用习惯 三、线程库...效果: 注意: 如果是类成员函数作为线程参数时,必须将this作为线程函数参数 示例: #include #include using namespace...,因此在C++11中,原子类型只能从其模板参数中进行构造,不允许原子类型进行拷贝构造、移动构造以及operator=等,为了防止意外,标准库已经将atmoic模板类中的拷贝构造、移动构造、赋值运算符重载默认删除掉了

    1.2K30

    【C++航海王:追寻罗杰的编程之路】C++11(四)

    表达式实际上可以理解为无名函数,该函数无法直接调用,如果想要直接调用,可以借助auto将其赋值给一个变量。...函数对象将rate作为其成员变量,在定义对象时给出初始值即可,lambda表达式通过捕捉列表可以直接将该变量捕捉到。...数值n表示生成的可调用对象中参数的位置:_1作为newCallable的第一个参数,_2为第二个参数,以此类推。...采用无参构造函数构造的线程对象 线程对象的状态已经转移给其他线程对象 线程已经调用join或者detach结束 4.2 -> 线程函数参数 线程函数的参数是以值拷贝的方式拷贝到线程栈空间中的,因此:即使线程参数为引用类型...注意: 如果是类成员函数作为线程参数时,必须将this作为线程函数参数。

    13810

    C++11『lambda表达式 ‖ 线程库 ‖ 包装器』

    表达式 构建出的 匿名函数对象 比较抽象,一般都是将此 匿名函数对象 作为参数传递(比如 sort),如果需要显式调用,最好是将创建出来的 匿名函数对象 赋给一个 有名函数对象,调用时逻辑会清晰很多...,只需要编写一个 lambda 表达式生成函数对象 方便些: lambda 表达式具有 捕捉列表,可以轻松捕获外部的变量,避免繁琐的参数传递与接收 函数编程支持: lambda 表达式可以作为函数的参数...,它就像一个函数包装器(适配器),接受一个可调用对象,生成一个新的可调用对象来“适应”原对象的参数列表 bind 绑定 可以修改参数传递时的位置以及参数个数,生成一个可调用对象,实际调用时根据 修改 规则进行实际的函数调用...,比如这里第二次调用虽然传递了 10 和 20,但实际调用 Func 时,RFunc 会先传递之前绑定的值 100 作为参数1传递,而 10 会作为参数2传递,至于 20 会被丢弃 注意: 无论绑定的是哪一个参数...,但实际调用时,仍然需要传递对应函数的参数,否则无法进行函数匹配调用,当然实际传入的参数是绑定的值,这里传参只是为了进行匹配;并且如果不对类对象进行绑定,需要更改包装器中的类型,调用时也需要传入参数进行匹配

    53310

    【c++】一篇文章带你了解c++11的新特性&&c++11详解

    ,C++11对STL中的不少容器就增加 std::initializer_list作为参数的构造函数,这样初始化容器对象就更方便了。...与普通函数的参数列表一致,如果不需要参数传递,则可以连同()一起省略 mutable:默认情况下,lambda函数总是一个const函数,mutable可以取消其常量性。...表达式实际上可以理解为无名函数,该函数无法直接调用,如果想要直接调用,可借助auto将其赋值给一个变量 10.3.2 捕获列表说明 捕捉列表描述了上下文中那些数据可以被lambda使用,以及使用的方式传值还是传引用...< a << endl; // 地址的拷贝 thread t3(ThreadFunc2, &a); t3.join(); cout << a << endl; return 0; } 注意:如果是类成员函数作为线程参数时...,必须将this作为线程函数参数 12.3 原子性操作库(atomic) 多线程最主要的问题是共享数据带来的问题(即线程安全)。

    19510

    C++ std::thread线程详解

    创建一个thread std::thread 是 C++ 中表示单个线程的线程类。要启动线程,我们只需要创建一个新的线程对象,并将要调用的执行代码(即可调用对象)传递到对象的构造函数中。...可调用对象可以是以下五个项中的任何一个: 函数指针 Lambda 表达式 函数对象 非静态成员函数 静态成员函数 定义可调用对象后,我们将其传递给构造函数。...表达式启动线程****************/ //定义一个lambda表达式 auto f = [](params) { ... }; //使用 lambda 表达式作为可调用对象来启动 std...Base b; // 第一个参数是类非静态成员函数的引用 // 第二个参数类对象的引用 // 第三个参数是非静态成员函数的参数 std::thread thread_obj(&Base::foo,...*************************************************/ 注:我们总是将可调用对象的参数作为参数单独传递给线程构造函数。

    1.9K20

    【C++】C++11常用特性总结

    在C++98里面,下面三行代码的效率是一样的,都需要先进行对象的构造,然后将构造出来的对象作为左值传到链表对象的push_back接口,push_back内部一定会new一个结点出来,将左值参数里的资源重新拷贝一份放到...如果此时直接调用Fun,并将t参数传过去,就会发生我们之前所说的问题,右值被右值引用过后属性丢失,引用对象重新变为左值,那t就会作为左值传递给Fun函数,所以就只能调用到const左值引用和左值引用版本的...C++11此时就提出了完美转发:函数模板std::forward(),此函数可以帮助我们在调用某些函数进行传参时,保证参数的原有属性不变。...由于构造函数对内置类型不处理,所以C++11在成员变量打了补丁,即允许在类定义的时候,给成员变量缺省值,这个缺省值会在构造函数的初始化列表使用,进行成员变量的初始化。...下面的使用方式灵活的体现了C++面向对象的特性,我们将线程当作对象存储到容器vector里面,创建线程的同时将lambda可调用对象传给线程,这样所有的线程就会同时并发的打印0-99数字。

    82140

    c++ 11 新特性

    注:作者 Danny Kalev 曾是 C++ 标准委员会成员。 Lambda 表达式 Lambda 表达式的形式是这样的: [cpp] view plaincopyprint?...& 的意义是 lambda 函数体要获取一个 Uppercase 引用,以便能够改变它的值,如果没有 &,那就 Uppercase 将以传值的形式传递过去。...//C++11   f(nullptr) //毫无疑问,调用的是 #2   所有跟指针有关的地方都可以用 nullptr,包括函数指针和成员指针: [cpp] view plaincopyprint... //指向函数的指针   委托构造函数 C++11 中构造函数可以调用同一个类的另一个构造函数: [cpp] view plaincopyprint?...下面介绍一些 C++11 的标准库新特性: 线程库 从程序员的角度来看,C++11 最重要的特性就是并发了。

    96410

    C++11 Lambda表达式

    ),如果需要在Lambda中进行修改的话,需要在形参列表后添加mutable关键字(按值传递无法改变Lambda外变量的值)。...当该类被构造时,周围的变量就传递给构造函数并以成员变量保存起来,看起来跟函数对象(仿函数)很相似,但是C++11标准建议使用Lambda表达式,而不是函数对象,Lambda表达式更加轻量高效,易于使用和理解...因此,严格来说,lambda函数并非函数指针,但是C++11允许lambda表达式向函数指针转换,前提是没有捕捉任何变量且函数指针所指向的函数必须跟lambda函数有相同的调用方式。...lambda函数是通过仿函数来实现的,捕捉到的变量相当于是仿函数类中的成员变量,而lambda函数相当于是成员函数,const成员函数自然不能修改普通成员变量; (2)使用引用的方式捕获的变量在常量成员函数中值被更改则不会导致错误...所以可以修改按值方式捕获到的变量; (4)按值传递参数的const_param_lambda修改的是传入lambda函数的实参,当然不会有问题。

    1.3K31

    C++11 Lambda 表达式

    ),如果需要在Lambda中进行修改的话,需要在形参列表后添加mutable关键字(按值传递无法改变Lambda外变量的值)。...当该类被构造时,周围的变量就传递给构造函数并以成员变量保存起来,看起来跟函数对象(仿函数)很相似,但是 C++11 标准建议使用 Lambda 表达式,而不是函数对象,Lambda 表达式更加轻量高效,...因此,严格来说,lambda函数并非函数指针,但是C++11允许lambda表达式向函数指针转换,前提是没有捕捉任何变量且函数指针所指向的函数必须跟lambda函数有相同的调用方式。...lambda函数是通过仿函数来实现的,捕捉到的变量相当于是仿函数类中的成员变量,而lambda函数相当于是成员函数,const成员函数自然不能修改普通成员变量; (2)使用引用的方式捕获的变量在常量成员函数中值被更改则不会导致错误...所以可以修改按值方式捕获到的变量; (4)按值传递参数的const_param_lambda修改的是传入lambda函数的实参,当然不会有问题。

    2K41

    【C++】深入剖析C++11新特性

    ,C++11对STL中的不少容器就增加std::initializer_list作为参数的构造函数,这样初始化容器对象就更方便了。...(例如我们不能用类的模版参数来作为完美转发的参数,因为在初识化类的时候就已经实例化了。) ---- 八、新的类功能 1.默认成员函数 原来C++类中,有6个默认成员函数: 1....默认生成的移动构造函数,对于内置类型成员会执行逐成员按字节拷贝,自定义类型成员,则需要看这个成员是否实现移动构造,如果实现了就调用移动构造,没有实现就调用拷贝构造。...默认生成的移动构造函数,对于内置类型成员会执行逐成员按字节拷贝,自定义类型成员,则需要看这个成员是否实现移动赋值,如果实现了就调用移动赋值,没有实现就调用拷贝赋值。...原因:静态成员函数没有 this 指针,所以 function 类实例化时不需要添加一个成员函数所属类的类型参数,在调用时也不需要传递一个成员函数所属类的对象;而非静态成员则有,所以需要借助类对象来传递

    59540

    【C++修炼之路】29.lambda表达式

    (parameters):参数列表。与普通函数的参数列表一致,如果不需要参数传递,则可以连同()一起省略。...注意: 在lambda函数定义中, 参数列表和返回值类型都是可选部分,而捕捉列表和函数体可以为空 因此C++11中最简单的lambda函数为:[]{}; 该lambda函数不能做任何事情。...---- 对于捕捉的值,实际上我们也可以将lambda所在的函数的所有变量通过**=或&直接进行全部捕捉,=为传值捕捉,&为传引用捕捉** 注意:想要使用的变量需要在lambda声明之前定义,否则找不到变量...//这就很c++11 int main() { //N个线程同时跑 vector vThreads;//将线程作为对象传到容器中。...仿函数对象将rate作为其成员变量,在定义对象时给出初始值即可,lambda表达式通过捕获列表可以直接将该变量捕获到。

    36000

    【C++】:bind绑定器和function函数对象机制

    function引入 function的作用是将具有相同调用形式的不同类型可调用对象进行类型统一。 相同的调用形式可以简单理解为:参数列表和返回值相同。...std::function的实例可以对任何可以调用的目标实体进行存储、复制、和调用操作,这些目标实体包括普通函数、Lambda表达式、函数指针、以及其它函数对象等。...然后用该函数指针创建一个对象func,将sum「函数名表示该函数的地址」赋值给func。然后就可以通过func调用sum函数。...std::bind 可以用来绑定函数的参数,或者将成员函数和对象绑定在一起,生成一个新的可调用对象(也称为函数对象)。...这个新生成的对象可以像普通函数一样被调用,但其内部实际上会调用我们最初绑定的那个函数或成员函数。

    16510

    : std::function

    在C/C++中函数指针作为一种回调机制被广泛使用,但是函数指针在C++面向对象编程中有些不足,比如无法捕捉上下文。举个例子,使用对象的非静态成员函数作为函数指针就无法做到。...相比函数,仿函数可以拥有初始状态,一般通过class定义私有成员,并在声明对象的时候对其进行初始化。私有成员的状态就成了仿函数的初始状态。...+11中的lambda函数。...std::function可以用于保存并调用任何可调用的东西,比如函数、lambda函数、std::bind表达式、仿函数,甚至是指向对象成员的指针。...下面的示例演示了将函数指针、lambda函数和std::bind表达式传递给std::function: int add(int a, int b) { return (a + b); } int sub

    1.3K20
    领券