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

bind不接受绑定占位符的std::cref -为什么?

bind是C++标准库中的一个函数,用于创建函数对象(函数指针、成员函数指针或函数对象)的绑定副本。在绑定过程中,可以使用占位符(placeholder)来表示将来传递给函数对象的参数。

std::cref是C++标准库中的一个函数模板,用于创建一个指向常量引用的对象。它通常用于将常量引用作为参数传递给函数对象。

然而,bind函数不接受绑定占位符的std::cref。这是因为bind函数在绑定过程中会对参数进行拷贝或移动操作,而std::cref创建的是一个常量引用,无法进行拷贝或移动操作。

如果需要将常量引用作为参数传递给bind函数,可以使用std::cref的std::reference_wrapper包装器。std::reference_wrapper是一个可复制的函数对象,它可以在绑定过程中进行拷贝或移动操作。

以下是一个示例代码:

代码语言:txt
复制
#include <functional>
#include <iostream>

void foo(const int& x) {
    std::cout << x << std::endl;
}

int main() {
    int x = 42;
    auto f = std::bind(foo, std::cref(x)); // 使用std::cref创建常量引用
    x = 24; // 修改x的值
    f(); // 输出42,因为使用了常量引用

    return 0;
}

在上述示例中,我们使用std::cref创建了一个常量引用,并将其作为参数传递给bind函数。然后,我们修改了x的值,但在调用f函数时,仍然输出了最初绑定时的值42。

对于腾讯云相关产品和产品介绍链接地址,由于要求不能提及具体的云计算品牌商,无法给出具体的推荐链接。但腾讯云提供了丰富的云计算服务,包括云服务器、云数据库、云存储等,可以根据具体需求选择适合的产品。

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

相关·内容

参数绑定---bind函数

对每个占位名字,我们都必须提供一个单独using声明。...这个新可调用对象将它自己参数作为第三个和第五个参数传递给f. f第一个,第二个参数和第四个参数分别被绑定到给定值a,b,c上。 传递给g参数按参数位置绑定占位。...实际上,这个bind调用会将 g(_1,_2) 映射为 f(a,b,_2,c,_1) 即,对g调用会调用f,用g参数代替占位,再加上绑定参数a,b和c....因此,当sort比较两个元素时,就好像调用isShorter(B,A); 绑定引用参数 默认情况下,bind那些不是占位参数被拷贝到bind返回可调用对象中。...标准库中还有一个cref 函数,生成一个保存const引用类 与bind一样,函数ref和cref定义在头文件functional中 注意: 标准库中定义了两个分别为bindlst和bind2nd函数

1.1K30

【Example】C++ 回调函数及 std::function 与 std::bind

std::bind 它是一个基于模板函数,顾明思意它作用是绑定并返回一个 std::function 对象。 那么什么是“绑定”?...为什么要进行“包装”与“转发”呢? 首先,不规范解释是,function 作用是包装,它可以包装类成员函数,但却无法生成类成员函数可调用对象。而 std::bind 则是可以生成。...】std::bind(&BrainToolBox::Add, brain, std::placeholders::_1, std::placeholders::_2); 当用作普通函数绑定时,第一个参数是可调用对象...2,到 bind 参数被复制或移动,而且决不按引用传递,除非包装于 std::ref 或 std::cref 。...3,允许同一 bind 表达式中多重占位(例如多个 _1 ),但结果仅若对应参数( u1 )是左值或不可移动右值才良好定义。

4.4K30

4.6 C++ Boost 函数绑定回调库

在使用boost::bind()函数时,需要通过占位指定参数位置,例如_1表示第一个参数,_2表示第二个参数,以此类推。...首先来看一下使用bind完成针对普通函数绑定,以及通过占位实现指针函数绑定操作。...::bind(MyFunctionB, "lyshark", 10001,25); std::cout << "绑定调用: " << ref_b() << std::endl; // 绑定时指定占位...还可以绑定成员函数,在绑定成员函数时,必须将其绑定到对象或者指针上,因此使用bind绑定时需要牺牲一个占位位置,该绑定最多支持绑定8个参数。...在bind()函数中,占位_1表示绑定参数位置。 在本示例中,函数对象f1将my_func第一个参数设为10,第二个参数为绑定参数。

20230

第 10 章 泛型算法

它接受一个可调用对象,生成一个新可调用对象来“适应”原对象参数列表。_n是占位,表示新调用对象参数。这些名字都定义在名为 placeholders命名空间中,使用之前需要声明。...= bind(check_size, _1, 6); 可以用 bind绑定给定可调用对象参数或重新安排其顺序。..., w.end(), isShorter); // 按单词长度由长至短排序 sort(w.begin(), w.end(), bind(isShorter, _2, _1)); bind那些不是占位参数都是被拷贝到...bind返回可调用对象中,因此,对于有些我们希望以引用方式传递或无法拷贝类型参数,需要使用 ref/cref。...auto bf_2 = bind(f, n1, cref(n2), cref(n3)); ---- 10.4 再探迭代器 插入迭代器。

82080

std和boostfunction与bind实现剖析

首先是bind函数Bind函数 在使用过程中实际上是有几个疑问点: 如何统一处理函数、成员函数和仿函数类型绑定? 如何处理绑定函数参数和调用时参数?...如何控制调用时占位位置和区分占位与传入参数? 首先,需要知道是,bind函数返回是一个叫bind_t模板类。并且这是个可调用对象(重载了operator()操作)。...图7: Boost 1.55.0 bind执行流程略图 执行流程解决了,最后就剩第三个问题,如何控制调用时占位位置和区分占位与传入参数。...首先是成员函数重载实现对占位取相应数据。这里面 **boost::arg到boost::arg**分别是占位。如果是占位,就会返回参数列表(也就是新list)内对应位置数据。...否则直接把传入数据引用返回去了。而这里传入数据都是由原保存数据list内容,也就是执行bind函数时传入东东。 这就用非常简洁地实现了任意控制占位和预先传入参数。

98230

std和boostfunction与bind实现剖析

首先是bind函数Bind函数 在使用过程中实际上是有几个疑问点: 如何统一处理函数、成员函数和仿函数类型绑定? 如何处理绑定函数参数和调用时参数?...如何控制调用时占位位置和区分占位与传入参数? 首先,需要知道是,bind函数返回是一个叫bind_t模板类。并且这是个可调用对象(重载了operator()操作)。...[](p938_07.png) 图7: Boost 1.55.0 bind执行流程略图 执行流程解决了,最后就剩第三个问题,如何控制调用时占位位置和区分占位与传入参数。...这里面 boost::arg到boost::arg分别是占位。如果是占位,就会返回参数列表(也就是新list)内对应位置数据。否则直接把传入数据引用返回去了。...而这里传入数据都是由原保存数据list内容,也就是执行bind函数时传入东东。 这就用非常简洁地实现了任意控制占位和预先传入参数。其他参数个数实现方法类似,这里就不一一截图列举了。

1.8K10

【C++】STL 算法 ⑩ ( 函数适配器 | 函数适配器概念 | 函数适配器分类 | 函数适配器辅助函数 | std::bind2nd 函数原型及示例 | std::bind 函数原型及示例 )

常用类型两类 : 绑定适配器 : std::bind 绑定适配器 : 引入一个 通用绑定机制 , 可 绑定 函数 / 函数指针 / 函数对象 / 成员函数指针 任意 位置 参数 到指定值 ,...参数 绑定到一个特定值 , 从而创建一个新一元函数对象 ; C++ 11 弃用 , 建议使用 std::bind 绑定适配器 ; std::binder2nd 绑定适配器 : 将一个二元函数对象...: 返回是一个未指定类型 , 这个类型是一个函数对象 , 可以像普通函数那样被调用 ; 当返回函数对象被调用时 , 它会用提供参数和 std::bind占位来调用 fn ; 占位...是 std::placeholders::_1 , std::placeholders::_2 等值 ; 如果 参数中是 std::placeholders::_1 占位 , 表示 第一个 参数 ,...不进行修改 , 仍然保持其默认值 ; std::placeholders::_2 占位 , 表示 第二个 参数 , 不进行修改 , 仍然保持其默认值 ; 2、代码示例 - std::bind 函数

13710

C++ 新特性学习(五) — 引用包装、元编程类型属性和计算函数对象返回类型

、(成员)函数(指针) 构造时必须传入所引用对象或引用对象右值引用 主要方法有 =号操作, 用于重新绑定引用对象 类型转换操作, 用于转换为模板目标类引用类型 get方法, 用于获取引用对象...()操作, 用于执行引用函数 同时与其配对函数有 std::ref 返回std::reference_wrapper,可以视为转换对象为引用 std::cref 返回常量引用对象std::reference_wrapper...std::bind(&assign, std::ref(a), b); func(); printf("a => %d, b => %d\n", a, b); return...0; } 注意:如果不用std::ref包装,即便函数申明需传入引用类型,但是由于绑定变量和函数参数类型推断是分离,会导致传值而不是引用 另外有些函数,如 std::ptr_fun, 通过函数指针构造函数对象...std::mem_fun, 通过成员函数指针构造函数对象 std::mem_fun_ref, 通过成员函数指针构造函数对象引用 不推荐使用,因为完全可以用std::bind代替,详细请参见 http:

1.2K30

C++ 新特性学习(四) — Bind和Function

这就是传说中绑定库和增强型函数对象 接下来一个一个来 Bind 可用于绑定函数、成员函数、函数对象、成员变量 这是老标准中std::bind1st和std::bind2nd增强版,这两个函数只能且必须绑定一个带有两个参数...std::placeholders::_1是占位,表示调用时第一个参数,这段代码里表示x 如果代码是std::bind(f, std::placeholders::_2, std::placeholders...另外,std::bind还可以用于绑定成员变量,和函数结构,绑定函数变量方法类似成员函数,绑定函数结构方法类似普通函数 再来一个std::bind稍微复杂一点应用例子,和算法库配合使用 void...(特别注意绑定类成员时遗漏类实例) 绑定参数类型不匹配将会在调用时编译错误 占位不匹配将会在调用时编译错误 绑定对象必须是函数或成员函数指针 绑定对象默认为c++函数且不支持变长参数函数,...10个占位,而G++支持30个占位 Function 这东西是针对函数对象多态包装器(又称多态函数对象包装器),函数对象又称仿函数。

2.3K10

C++ 新特性学习(五) — 引用包装、元编程类型属性和计算函数对象返回类型

、(成员)函数(指针) 构造时必须传入所引用对象或引用对象右值引用 主要方法有 =号操作, 用于重新绑定引用对象 类型转换操作, 用于转换为模板目标类引用类型 get方法, 用于获取引用对象...()操作, 用于执行引用函数 同时与其配对函数有 std::ref 返回std::reference_wrapper,可以视为转换对象为引用 std::cref 返回常量引用对象std::...void()> func = std::bind(&assign, std::ref(a), b); func(); printf("a => %d, b => %d\n", a,...b); return 0; } 注意:如果不用std::ref包装,即便函数申明需传入引用类型,但是由于绑定变量和函数参数类型推断是分离,会导致传值而不是引用 另外有些函数,如 std:...std::bind代替,详细请参见 http://www.owent.net/2012/536.html 然后是 元编程类型属性 元编程定义是可以修改自身或其他代码代码,当然,C++不是动态语言,

1.8K30

function和bind

; } int main() { mycallback(1, runfunc); //runfunc(1) } 3.std::bind绑定器,也是个类模版,C++11引入 std::bind能够将对象以及相关参数绑定到一起...,绑定完后可以直接调用,也可以用std::function进行保存,再需要调用 格式: std::bind(待绑定函数对象/函数指针/成员函数指针,参数绑定值1,参数绑定值2…参数绑定值n) 总结:...) { cout << str << endl; } int main() { auto test = std::bind(hello, "china"); return 0; } 占位placeholders...bf2(5, 15); //输出是5,15,30 } 这表示绑定函数func第三个参数为30,func第一个和第二个参数分别由调用bf2时第一二个参数指定 _1是标准库里定义占位含义,类似这样占位有...,而是对象 发现确实输出是10,20,但是调试过程你会发现ct里面的m_a值是0,而不是x值10,这是为什么呢 这是auto bf5 = std::bind(&CT::func, ct, std::

8910

参数绑定

bind作用和形式 bind用于将一个可调用对象绑定到新可调用对象上,新对象参数就是被绑定对象参数列表中占位所占据位置参数 其调用形式如下: auto newCallable=bind(callable...也可以包含被绑定对象参数。arg_list应该和被绑定对象参数一样多。..._1, _2, 10); 这样就将sum绑定bind新生成一个调用sum对象上; _ 1表示新对象中第一个参数,是一个占位。...也就是说,实际上,这个bind会add( _ 1, _ 2)会被映射成为sum( _ 1, _ 2, 10),此时add参数就会代替原来占位成为调用sum参数,当然前提是两者类型要匹配。...<< t << " " << t1 << endl; return 0; } bind也可以换原来参数顺序,因为实际在调用新对象时,我们传递给新对象参数实际就是那些占位占据位置参数,所以上面调用情况如下

87211

参数绑定

本文链接:https://blog.csdn.net/Enterprise_/article/details/102806998 bind作用和形式 bind用于将一个可调用对象绑定到新可调用对象上...,新对象参数就是被绑定对象参数列表中占位所占据位置参数 其调用形式如下: auto newCallable=bind(callable,arg_list); bind第一个参数为一个可调用对象..._1, _2, 10); 这样就将sum绑定bind新生成一个调用sum对象上; _ 1表示新对象中第一个参数,是一个占位。...也就是说,实际上,这个bind会add( _ 1, _ 2)会被映射成为sum( _ 1, _ 2, 10),此时add参数就会代替原来占位成为调用sum参数,当然前提是两者类型要匹配。...<< t << " " << t1 << endl; return 0; } bind也可以换原来参数顺序,因为实际在调用新对象时,我们传递给新对象参数实际就是那些占位占据位置参数,所以上面调用情况如下

1.7K50

C++编程经验(11):std::function 和 bind绑定

文章目录 简介 std::function 可调用对象 std::bind std::placeholders 简介 在前面C++集群项目里面大量应用到了绑定器来做解耦操作,那么,绑定器到底是什么呢...有什么玄妙地方嘞? 其实也不是很玄乎,以前写Qt时候就经常用到绑定,昨天又发现,其实我们一直在用绑定器却不自知,比如说创建线程,将函数指针与它参数一并传入。...---- std::bind std::bind用来将可调用对象与起参数一起进行绑定绑定结果使用std::function进行保存,并在我们需要调用时候调用。...,是占位。...通过std::placeholders占位绑定函数参数,使得std::bind使用非常灵活。std::placeholders决定函数占用位置取用输入参数第几个参数。

1.2K10

C++之std::function、std::bind、lambda特性

unsetunsetstd::bindunsetunset std::bind 是 C++11 标准库中一个函数模板,用于创建一个可调用对象(函数对象或函数指针),并绑定到指定参数。...下面是 std::bind 主要特点和用法: 延迟函数调用:std::bind 允许我们在创建可调用对象时不立即调用函数,而是将函数对象和参数绑定起来,以便在稍后时间点进行调用。...部分应用函数:std::bind 允许我们在创建可调用对象时只绑定部分参数,剩余参数可以在稍后调用中提供,从而实现函数部分应用。...支持占位std::bind 支持占位std::placeholders::_1、std::placeholders::_2 等),用于指示在调用时提供参数位置。...,我们使用 std::bind 将函数对象 myObject 绑定到参数,并创建了两个可调用对象 func1 和 func2。

16210
领券