c++中bind的参数传递方式

c++中bind的参数传递方式

在bind函数中的参数传递方式

看代码:

extern "C"{
    int printf(const char * format, ...);
}

#include<functional>

void func(int val){
    printf("Val = %d\n", val);
    return;
}

int main(){
    int a = 520;
    auto callfunc = std::bind(func, a);
    a = 521;
    callfunc();
    return 0;
}

执行结果为:

Val = 520

这说明这种情况下,std::bind绑定的参数是按值传递。

将func函数的形参改为引用试试,其它部分不变:

void func(int &val){
    printf("Val = %d\n", val);
    return;
}

输出仍为:

Val = 520

这说明了std::bind总是复制其实参。但调用方却可以通过对某实参实施std::ref的手法达成按引用传值的效果。代码如下:

extern "C"{
    int printf(const char * format, ...);
}

#include<functional>

void func(int &val){
    printf("Val = %d\n", val);
    return;
}

int main(){
    int a = 520;
    auto callfunc = std::bind(func, std::ref(a));
    a = 521;
    callfunc();
    return 0;
}

输出为:

Val = 521
在bind返回的结果对象中的形参传递方式

可以在bind中使用std::placeholders::_1占位符代表要传给func的第一个参数,依次类推可以得到第二、第三个参数的表示。

看代码:

extern "C"{
    int printf(const char * format, ...);
}

#include<functional>

void func(int val){
    printf("Val = %d\n", val);
    val = 523;
    return;
}

int main(){
    int a = 520;
    auto callfunc = std::bind(func, std::placeholders::_1);
    a = 521;
    callfunc(a);
    printf("After Call Val = %d\n", a);
    return 0;
}

输出为,传递方式为传值:

Val = 521
After Call Val = 521

把func中的形参改为引用方式:

extern "C"{
    int printf(const char * format, ...);
}

#include<functional>

void func(int &val){
    printf("Val = %d\n", val);
    val = 523;
    return;
}

int main(){
    int a = 520;
    auto callfunc = std::bind(func, std::placeholders::_1);
    a = 521;
    callfunc(a);
    printf("After Call Val = %d\n", a);
    return 0;
}

输出为:

Val = 521
After Call Val = 523

上述两个例子说明,绑定对象的函数调用运算符其实利用了完美转发,所以绑定对象的所有实参都是按引用传递的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值