首页
学习
活动
专区
工具
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.2K30

【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 )是左值或不可移动右值才良好定义。

5K30
  • 4.6 C++ Boost 函数绑定回调库

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

    25030

    第 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 再探迭代器 插入迭代器。

    84080

    std和boost的function与bind实现剖析

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

    1.1K30

    std和boost的function与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

    包装器 : function 与 bind 的原理及使用

    这是由于普通成员函数总是绑定到某个对象实例,因此在调用时需要知道具体是哪个对象调用了该函数。 function包装普通成员函数为什么要传入 this 指针参数?...std::bind 可以调整原有函数的参数个数和顺序,适配更为灵活的调用方式。它广泛用于实现函数的“占位符”特性和简化代码的参数传递。...std::bind 参数的顺序调整与绑定 顺序调整 在 std::bind 中,通过 placeholders 命名空间可以使用 _1、_2 等占位符表示绑定的函数参数。...using namespace placeholders; // 将占位符全部展开 这些占位符用于定义生成的可调用对象中参数的位置,例如 _1 表示第一个参数, _2 表示第二个参数,以此类推。...<< endl; // Sub(5, 10); 参数的绑定 如果想让某个参数的值进行绑定,就在该参数位置上传入值即可,之后如果有传入参数需要可以继续按照占位符当前个数继续进行填写。

    20010

    【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 函数

    21610

    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.3K30

    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.5K10

    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::

    10610

    参数绑定

    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也可以换原来参数的顺序,因为实际在调用新对象时,我们传递给新对象的参数实际就是那些占位符占据的位置的参数,所以上面调用情况如下

    91211

    参数绑定

    本文链接: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
    领券