c ++ 11 bind:using和not-using占位符之间的区别

时间:2014-01-25 17:34:31

标签: c++

我有以下代码:

  1 #include <functional>
  2 #include <iostream>
  3 
  4 using namespace std::placeholders;
  5 
  6 void update23(int i1, int &i2, int &i3)
  7 {
  8     i2 += i1;
  9     i3 += i2;
 10 
 11     std::cout << i2 << "  " << i3 << std::endl;
 12 }
 13 
 19 
 20 int main()
 21 {
 22     int i1 = 10, i2 = 20, i3 = 30;
 23 
 26     std::bind(update23, 10, 20, 30)();
 27     std::bind(update23, 10, _1, _2)(20, 30);
 28       
 29     return 0;
 30 }   

第27行编译失败。失败是有道理的,因为常量作为引用传递。

为什么第26行通过?

我检查了c ++绑定源,但很快就迷路了。

如果你能引导我通过绑定源来了解这里的魔力,那就非常感激!

1 个答案:

答案 0 :(得分:2)

像往常一样,您不能使用临时值调用期望可变左值引用(例如第二个{​​{1}}表达式的结果)的函数。

第一个版本有效,因为绑定值是按值捕获的,并作为lvalues提供给调用。

您可以更改功能签名或将呼叫更改为:

bind