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++不合规。不幸的是,“由它编译的证明”不起作用:-)