C++ c++;11绑定:使用和不使用占位符的区别
我有以下代码:C++ c++;11绑定:使用和不使用占位符的区别,c++,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 &l
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 }
1#包括
2#包括
3.
4使用名称空间std::占位符;
5.
6无效更新23(int i1、int&i2、int&i3)
7 {
8 i2+=i1;
9 i3+=i2;
10
11 std::cout与往常一样,您不能调用期望具有临时值的可变左值引用(例如第二个bind
表达式的结果)的函数
第一个版本可以工作,因为绑定值由value捕获并作为左值提供给调用
您可以更改函数签名或将调用更改为:
std::bind(update23, 10, _1, _2)(i2, i3);
std::bind
复制绑定参数并将其存储为左值,以便稍后传递给回调。@Cthulhu它们在
中定义。代码对我来说编译得很好。您的编译器似乎无法优化它。我使用的是VS2012。VS2012似乎可以优化第27行,但仍然可以编译。至少对我来说是这样。@cageman:MSVS处于运行状态著名的C++不合规。不幸的是,“由它编译的证明”不起作用:-)