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