У меня есть следующий код С++ 11:
#include <iostream>
#include <functional>
using namespace std;
using namespace placeholders;
void f(int a, int b)
{
cout << a << " " << b << endl;
}
void g(int& a, int& b)
{
a *= 2;
b *= 3;
}
int main()
{
int a = 100;
int b = 200;
auto greversed = bind(g,_2,_1);
greversed(b,a);
f(a,b);
greversed(ref(b),ref(a));
f(a,b);
}
Основываясь на моем чтении "Язык программирования С++ 4th Edition" (Stroustrup) с. 968 Я ожидал бы, что во время первого вызова greversed (b, a) копия a и b будет передана ссылкой на g() и что только второй вызов фактически передаст a и b в g() по ссылке.
Пример кода, приведенного на стр. 968:
void incr(int& i)
{
++i;
}
void user()
{
int i =1;
incr(i); // i becomes 2
auto inc = bind(incr,_1);
inc(i); // i stays 2; inc(i) incremented a local copy of i
}
Запустив этот код, я увеличил его дважды, несмотря на то, что говорят комментарии.
Для моей программы ожидаемый результат:
100 200
200 600
Однако, когда я компилирую этот код под Ubuntu, используя "g++ -std = С++ 11 test.cpp", я получаю следующий вывод:
200 600
400 1800
Похоже, что a и b передаются по ссылке независимо от того, используется ли адаптер ref() или нет.