Wpis z mikrobloga

Właśnie w książce "Język C++. Kompendium wiedzy" trafiłem na coś takiego:

"Zwróć uwagę, że funkcja bind() przyjmuje jako argumenty zwykłe wyrażenia. To oznacza, że
referencje są poddawane dereferencji, zanim funkcja bind() ich użyje. Na przykład:

void incr(int& i)
{
++i;
}
void user()
{
int i = 1;
incr(i); // i ma wartość 2
auto inc = bind(incr,_1);
inc(i); // i pozostaje z wartością 2; inc(i) zwiększyło lokalną kopię i
}
"
Skompilowałem przykład u siebie (gcc) i mi na końcu wychodzi, że i ma wartość 3 a nie tak jak jest w komentarzu 2.
Ktoś mógłby mi to objaśnić?

#cpp
  • 9
  • Odpowiedz
@vonBielau: ¯\_(ツ)_/¯ a w jakim standardzie jest ta książka? Z tego co pamiętam to tam chyba nie było jeszcze nawet c++17 No, bo jeżeli kompilujesz przy najnowszym to czasem mogą wychodzić inne rzeczy, które między czasie zostały zmienione
  • Odpowiedz
@vonBielau: za https://en.cppreference.com/w/cpp/utility/functional/bind: The arguments to bind are copied or moved, and are never passed by reference unless wrapped in std::ref or std::cref. Jest to prawdą dla argumentów funkcji bind. Ale nie dla jej rezultatu. Czyli gdybyś do std::bind przekazał referencję, to zostałaby ona zdereferencjonowana. Ale gdy już wołasz to co zwróciło bind, to możesz tam przekazywać jak chcesz.
  • Odpowiedz
Podsumowując przykład powinien wyglądać tak:

void incr(int& i)
{
++i;
}
void user()
{
int i = 1;
incr(i); // i ma wartość 2
auto inc = bind(incr,i);
inc(); // i pozostaje z wartością 2; inc() zwiększyło lokalną kopię i
}
  • Odpowiedz