2014-01-25 62 views
2

之间差我有以下代码:C++ 11绑定:使用和不使用占位符

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++绑定源,但很快就迷路了。

如果你可以引导我通过绑定源来理解这里的魔法是什么,将非常感激!

+3

'的std :: bind'副本已绑定参数,并将它们作为左值稍后传递给回调。 – 0x499602D2

+0

@Cthulhu它们在'' – user2079303

+0

中定义,代码为我编译得很好。似乎你的编译器无法优化它。我正在使用vs2012 – cageman

回答

2

像往常一样,您不能调用一个函数,该函数需要一个具有临时值的可变左值引用(例如第二个bind表达式的结果)。

第一个版本的工作原理是因为绑定值是按值捕获的并作为左值提供给该调用。

您可以更改函数签名或电话更改为:

std::bind(update23, 10, _1, _2)(i2, i3); 
+0

看来VS2012可以优化27行并仍然可以编译。至少它对我有用。 – cageman

+1

@cageman:MSVS是臭名昭着的C++ - 不合规。 “证明它编译”不起作用,不幸的是:-) –