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

为什么C++ 11不能将不可复制的仿函数移动到std :: function?

这个问题涉及到C++11的标准库中的std::function和移动语义。在C++11中,std::function是一个通用的函数包装器,它可以将函数和可调用对象存储为一个类型安全的可调用对象。但是,当我们使用不可复制的仿函数时,我们不能将其移动到std::function中,这是因为std::function需要对其内部的可调用对象进行复制,以便在需要时进行调用。

具体来说,std::function需要对其内部的可调用对象进行复制,以便在需要时进行调用。但是,如果我们使用的是不可复制的仿函数,那么这个复制操作就会失败,因为不可复制的仿函数不能被复制。这就是为什么我们不能将不可复制的仿函数移动到std::function中的原因。

为了解决这个问题,我们可以使用std::move将不可复制的仿函数移动到std::function中。这样,我们就可以避免复制操作,从而避免了不可复制的仿函数的问题。

总之,std::function需要对其内部的可调用对象进行复制,以便在需要时进行调用。如果我们使用的是不可复制的仿函数,那么这个复制操作就会失败。为了解决这个问题,我们可以使用std::move将不可复制的仿函数移动到std::function中,从而避免复制操作。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

C++11 Lambda表达式

Lambda表达式是函数式编程基础,C++11引入了Lambda则弥补了C++函数式编程方面的空缺。...1.2作用 以往C++需要传入一个函数时候,必须事先进行声明,视情况可以声明为一个普通函数然后传入函数指针,或者声明一个仿函数(functor,函数对象),然后传入一个对象。...auto关键字实际会将 Lambda 表达式转换成一种类似于std::function内部类型(但并不是std::function类型,虽然与std::function“兼容”)。...>这种写法感到很神奇,可以查看 C++ 11 有关std::function用法。...lambda函数是通过仿函数来实现,捕捉到变量相当于是仿函数类中成员变量,而lambda函数相当于是成员函数,const成员函数自然不能修改普通成员变量; (2)使用引用方式捕获变量在常量成员函数中值被更改则不会导致错误

1.3K31

C++11 Lambda 表达式

Lambda 表达式是函数式编程基础,C++11 引入了 Lambda 则弥补了 C++函数式编程方面的空缺。...1.2 作用 以往C++需要传入一个函数时候,必须事先进行声明,视情况可以声明为一个普通函数然后传入函数指针,或者声明一个仿函数(functor,函数对象),然后传入一个对象。...auto关键字实际会将 Lambda 表达式转换成一种类似于std::function内部类型(但并不是std::function类型,虽然与std::function“兼容”)。...>这种写法感到很神奇,可以查看 C++ 11 有关std::function用法。...lambda函数是通过仿函数来实现,捕捉到变量相当于是仿函数类中成员变量,而lambda函数相当于是成员函数,const成员函数自然不能修改普通成员变量; (2)使用引用方式捕获变量在常量成员函数中值被更改则不会导致错误

2K41
  • : std::function

    lambda函数在本质上并非函数,这样导致一个问题: 函数指针不能指向lambda函数,因为lambda函数本质上并非函数仿函数函数指针及lambda函数类型也不相同。...当然上述问题也不是没有解决方法,通过C++模板(template)就可以,std::sort实现就使用了模板,不论使用函数仿函数还是lambda函数实现排序算法,均可以传给std::sort。...std::function可以用于保存并调用任何可调用东西,比如函数、lambda函数std::bind表达式、仿函数,甚至是指向对象成员指针。...下面的示例演示了函数指针、lambda函数std::bind表达式传递给std::function: int add(int a, int b) { return (a + b); } int sub...然而,std::function相较于函数指针,性能上会有一点点损失,如果不是在性能特别关键场合,还是大胆拥抱C++ 11这一新特性吧!

    1.3K20

    : std::function

    ::function 在上一篇文章中我们介绍了C++11lambda函数。...当然上述问题也不是没有解决方法,通过C++模板(template)就可以,std::sort实现就使用了模板,不论使用函数仿函数还是lambda函数实现排序算法,均可以传给std::sort。...std::function可以用于保存并调用任何可调用东西,比如函数、lambda函数std::bind表达式、仿函数,甚至是指向对象成员指针。...下面的示例演示了函数指针、lambda函数std::bind表达式传递给std::function: int add(int a, int b) { return (a + b); } int sub...然而,std::function相较于函数指针,性能上会有一点点损失,如果不是在性能特别关键场合,还是大胆拥抱C++ 11这一新特性吧!

    2.2K30

    C++11——lambda表达式

    通常用用来实现回调函数、代理等功能。lambda表达式是函数式编程基础,C++11引入了lambda则弥补了C++函数式编程方面的空缺。...作用: 以往C++需要传入一个函数时候,必须事先进行声明,视情况可以声明为一个普通函数然后传入函数指针,或者声明一个仿函数(functor,函数对象),然后传入一个对象。...parameter list(参数列表)、return type(返回类型)、function body(函数体)与任何普通函数基本一致,但是lambda参数列表不能有默认参数,且必须使用尾置返回类型...)>这种写法感到很神奇,可以查看 C++ 11 有关std::function用法。...当该类被构造时,周围变量就传递给构造函数并以成员变量保存起来,看起来跟函数对象(仿函数)很相似,但是C++11标准建议使用lambda表达式,而不是函数对象,lambda表达式更加轻量高效,易于使用和理解

    1.4K21

    std和boostfunction与bind实现剖析

    复制function时,为什么会导致其关联对象也复制? 调用时如何区分成员函数、非成员函数、虚函数仿函数?...,部分functor数据被直接记在了function里,并且invoker实现直接采用了C++函数)_ 在boost实现里,每一种function实际绑定类型都对应着一个静态vtable对象...操作见图11,这里是对大于缓冲区对象执行复制构造。...简单来说,function实现原理就是模拟了C++编译器函数表,对外提供统一类型和接口。这样在我们拿它来做回调监听和事件响应时候就可以简单地提供一组接口。...就是对于boost引用包装,boost::functionfunctor部分采用了obj_ref结构来存储;但是对于标准库std引用包装,却是视为了小对象仿函数来处理。其实是没什么太大影响啦。

    1.8K10

    C++11新特性学习笔记

    改进 4.1 继承构造(vs2013 不支持) C++ 11允许派生类继承基类构造函数(默认构造函数复制构造函数、移动构造函数除外)。...std::functionC++中,可调用实体主要包括:函数函数指针、函数引用、可以隐式转换为函数指定对象,或者实现了opetator()对象。...C++11中,新增加了一个std::function类模板,它是对C++中现有的可调用实体一种类型安全包裹。...而事实上,仿函数是编译器实现lambda一种方式,通过编译器都是把lambda表达式转化为一个仿函数对象。因此,在C++11中,lambda可以视为仿函数一种等价形式。...而C/C++代码也总是对应地拥有一份操作系统赋予进程包括堆、栈、可执行(代码)及不可执行(数据)在内各种内存区域。 而在C++11中,一个相当大变化就是引入了多线程支持。

    2.1K20

    C++实现 STL 标准库和算法(一)实验楼笔记

    想 掌握C++强大标准库 通过本次课程,你学习到 c++ template ,异常处理 ,并回顾数据库部分知识 ,初步掌握 STL 开发 ,避免重复制造轮子。...提示:本课程所有代码至少需要开启 -std=c++11 选项来支持 C++11 相关特性,在介绍 C++14 特性时相关代码需要开启 -std=c++14 编译选项,例如: + g++ main.cpp...-std=c++11 + g++ main.cpp -std=c++14 1.STL是啥呀?...STL 由算法,容器,迭代器,适配器,仿函数函数对象),空间适配器六大部件组成 。我们主要讲解容器,迭代器,算法和仿函数。适配器部分会交给学员来实现,而空间适配器不会太过于深入。...而为什么需要仿函数呢?因为STL没有也不可能将所有东西都包含到函数中,而程序是对现实模拟,现实又是最复杂,一个sort(),你要 。如何协调呢?

    1.7K20

    C++11新特性学习笔记

    改进 4.1 继承构造(vs2013 不支持) C++ 11允许派生类继承基类构造函数(默认构造函数复制构造函数、移动构造函数除外)。...std::functionC++中,可调用实体主要包括:函数函数指针、函数引用、可以隐式转换为函数指定对象,或者实现了opetator()对象。...C++11中,新增加了一个std::function类模板,它是对C++中现有的可调用实体一种类型安全包裹。...而事实上,仿函数是编译器实现lambda一种方式,通过编译器都是把lambda表达式转化为一个仿函数对象。因此,在C++11中,lambda可以视为仿函数一种等价形式。...而C/C++代码也总是对应地拥有一份操作系统赋予进程包括堆、栈、可执行(代码)及不可执行(数据)在内各种内存区域。 而在C++11中,一个相当大变化就是引入了多线程支持。

    2.2K20

    C++进阶:C++11(列表初始化、右值引用与移动构造移动赋值、可变参数模版...Args、lambda表达式、function包装器)

    C++进阶:C++11(列表初始化、右值引用与移动构造移动赋值、可变参数模版…Args、lambda表达式、function包装器) 今天接着进行语法方面知识点讲解 1.统一列表初始化 1.1{}初始化...拷贝构造函数目的是一个对象复制到另一个对象中,以确保临时变量拥有正确值 那这个临时变量存在哪里呢?...包装器 在C++中,std::function是一个通用函数包装器,它可以用来存储、复制和调用任何可调用对象,包括函数指针、函数对象、Lambda表达式等。...C++function本质是一个类模板,function可以封装他们,目标是统一类型,统一后我们能传给各种容器使用,函数指针的话类型复杂、仿函数类型不同、Lambda表达式没有类型。...通过std::function模板参数,可以指定存储可调用对象类型。 存储可调用对象:std::function可以存储各种可调用对象,如函数指针、函数对象、Lambda表达式等。

    10800

    C++11学习笔记2

    std::function std::bind 我们知道在C里面有函数指针这么回事,我们用函数指针目的就是仿函数作为参数,传递给另外一个函数,并供他调用。...(int(*f)(int)){ f(3); } int main(){ func(callback); } 而C++11里提供了std::function这个工具来封装函数指针,上面的写法就可以变成下面的...::bind(callback,10,std::placeholders::_1); binded(3); } 上面的意思是int(int,int)这个函数封装成了int(10,int)这个函数并起名为...使用std::functionstd::bind可以非常装逼组合多个函数,非常具有模块化思想,比如下面的函数: #include #include #include...lambda表达式 lambda表达式我认为说白了就是一种匿名函数简写形式,是一种仿函数语法糖,可以看成是一个std::function对象,没什么稀奇

    29430

    std和boostfunction与bind实现剖析

    用过std和boostfunction对象和bind函数童鞋们都知道这玩意用起来腰不酸了,腿不疼了,心情也舒畅了。...然后是function对象 function对象也上是有几个疑问点: function对象是固定大小、固定类型,如何关联多种对象和函数复制function时,为什么会导致其关联对象也复制?...代码实现见下图 图片 图10: function对象拷贝* 图片 图11: function对象关联内容拷贝(大Object) 其中clone_functor_tag操作见图11,这里是对大于缓冲区对象执行复制构造...简单来说,function实现原理就是模拟了C++编译器函数表,对外提供统一类型和接口。这样在我们拿它来做回调监听和事件响应时候就可以简单地提供一组接口。...就是对于boost引用包装,boost::functionfunctor部分采用了obj_ref结构来存储;但是对于标准库std引用包装,却是视为了小对象仿函数来处理。其实是没什么太大影响啦。

    1.1K30

    UNIX(多线程):14---理解线程构造函数

    第一参数类型并不是c语言中函数指针(c语言传递函数都是使用函数指针),在c++11中,增加了可调用对象(Callable Objects)概念,总的来说,可调用对象可以是以下几种情况: 函数指针...重载了operator()运算符类对象,即仿函数 lambda表达式(匿名函数std::function 函数指针示例 // 普通函数 无参 void function_1() { } //....join(); t3.join(); 实验时候还发现一个问题,如果重载函数作为线程入口函数,会发生编译错误!...解决办法就是在Factor()外包一层小括号(),或者在调用std::thread构造函数时使用{},这是c++11同意初始化语法。...线程对象只能移动不可复制 线程对象之间是不能复制,只能移动,移动意思是,线程所有权在std::thread实例间进行转移。

    61020

    C++】C++11 新特性

    ---- 十二、lambda 表达式 1、lambda 表达式语法 在 C++98 中,为了替代函数指针,C++ 设计出了仿函数,也称为函数对象,仿函数实际上就是一个普通类,只是该类重载了函数调用操作符...function 是一个可调用对象包装器,可它以函数指针、仿函数以及 lambda 表达式、成员函数等可调用对象进行包装,使他们具有相同类型,包装器也可以像普通函数一样进行调用,包装器本质还是仿函数...在 C++11 标准中引入了 std::function 模板类,其定义在 头文件中。...可以看到,经过上面 function 包装,使得函数指针 f、仿函数 Functor、lambda 表达式以及类静态成员函数具有了统一类型 – function;类普通成员函数我们也可以通过后面的绑定来让它类型变为...std::function func1 = f; cout << useF(func1, 11.11) << endl; // 函数对象 std::function

    1.4K10

    【Modern C++】深入理解移动语义

    相反,该提议旨在增强复制语义 对于刚刚接触移动语义开发人员来说,很难理解为什么有了值语义还需要有移动语义。...再次引用Howard Hinnant在移动语义提案上一句话: 移动语义主要是性能优化:昂贵对象从内存中一个地址移动到另外一个地址能力,同时窃取源资源以便以最小代价构建目标 在C++11之前,...自C++11起,标准库提供了一个函数move()用于左值转换成右值。...push_back(T&&)使用BigObj移动构造函数资源从参数移动到vector内部BigObj对象中。而在C++11之前,上述代码则生成参数拷贝,然后调用BigObj拷贝构造函数。...如果T是可移动,那么整个操作非常高效。如果它是不可移动,那么它和普通swap函数一样,调用拷贝和赋值操作,不会出错,且是安全可靠

    84510

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

    一、C++11简介 在2003年C++标准委员会曾经提交了一份技术勘误表(简称TC1),使得C++03这个名字已经取代了C++98称为C++11之前最新C++标准名称。...::initializer_list std::initializer_list一般是作为构造函数参数,C++11对STL中不少容器就增加std::initializer_list作为参数构造函数...C++11中,std::move()函数位于 头文件中,该函数名字具有迷惑性,它并不搬移任何东西,唯一功能就是一个左值强制转化为右值引用,然后实现移动语义。...因此C++11中最简单lambda函数为:[]{}; 该lambda函数不能做任何事情。...C++function本质是一个类模板,也是一个包装器 那么我们来看看,我们为什么需要function呢?

    44940

    C++仿函数

    1.为什么要有仿函数 我们先从一个非常简单问题入手。...如果此时希望判定阈值也作为一个变量传入,变为如下函数不可行了: bool IsGreaterThanThreshold(int num, int threshold) { return num...如果一定要完成这个任务,按照以往经验,我们可以考虑如下可能途径: (1)阈值作为函数局部变量。局部变量不能函数调用中传递,故不可行; (2)函数传参。...那么有什么好处理方法呢?仿函数应运而生。 2.仿函数定义 仿函数(Functor)又称为函数对象(Function Object)是一个能行使函数功能类。...比如STL中容器set就使用了仿函数less ,而less继承binary_function,就可以看作是对于一类函数总体声明了,这是函数做不到

    3.8K32

    function和bind

    仿函数仿函数定义:仿函数(functor),它行为类似于函数东西(something that performs a function) C++仿函数是通过在类中重载()运算符实现,又称函数对象...,它可以一个类类型对象转换为另一种类型,这里operator tfpoint() 是一个T2类型对象转为一个函数指针类型,所以tc2(50)调用了由类型转换函数返回函数指针,并将参数50传给了他...++11 std::function是个类模版,用来装各种可调用对象,但不能装类成员函数指针 std::function类模版特点,就是能够通过给它指定模版函数,它就能够用统一方式来处理函数 2.1...,而是对象 发现确实输出是10,20,但是调试过程你会发现ct里面的m_a值是0,而不是x值10,这是为什么呢 这是auto bf5 = std::bind(&CT::func, ct, std::...思想:所谓延迟调用,将可调用对象统一格式,保存起来,需要时候再调用 b)我们有std::function绑定一个可调用对象,类型成员不能绑。

    10410

    【笔记】C++标准库: 体系结构与内核分析(下)

    仿函数 使用STL算法首先知道C++标准库算法大多都以指示目标容器范围两个迭代器开始, C标准库算法则比较混乱....其中C++算法有些会接受一个额外函数操作作为参数, 这个函数操作是用来改变算法关键行为, 例如原版accumulate()中是容器内容累加到初值上, 第二个版本变为容器内容使用传入操作与当前累计值进行叠加计算...显然unary_function是指行为只有一个参数仿函数, binary_function是有两个参数函数....绑定原生函数 绑定仿函数 绑定对象函数成员 绑定对象数据成员 下面是新版绑定典型使用效果, 核心改进是引入了占位符(std::placeholder), 现在我们只需要在bind里需要动态改变参数用占位符占用...Ch4 C++标准库周边设施 泛用hashfunction 利用C++11推出可变模板和模板特化设计, 下面是这门课给出一个比较泛用hash函数实现, 这个函数是递归模板函数一种典型情况,

    79420
    领券