Ошибка со связыванием в "Язык программирования С++ [4-е издание] - Bjarne Stroustrup"

Я нашел этот код в книге Bjarne Stroustrup: Скриншот страницы

Проблема с этим кодом заключается в том, что переменная i не остается на 2, она увеличивается до 3. Вы можете проверить ее здесь: https://wandbox.org/permlink/p5JC1nOA4pIpsgXb

Нам не нужно использовать std::ref() для увеличения этой переменной. Это ошибка в книге или что-то было изменено с С++ 11?

Ответы

Ответ 1

Пример неправильный, bind делает копию своих аргументов, если вы не обернете его в std::reference_wrapper, как правильно говорит текст, но это не то, что показывает пример. В этом примере аргумент i передается функтору, возвращаемому bind, а не самому bind. Если бы вместо этого был приведен пример, значение i оставалось бы 2.

auto inc = bind(incr, i);   // a copy of i is made
inc(); // i stays 2; inc(i) incremented a local copy of i

В примере, показанном в книге, аргумент i будет перенаправлен на incr, что приведет к тому, что исходная i передается функции lvalue, а оригинал i будет быть увеличено.

Для соответствующих стандартных котировок от 23.14.11.3 [func.bind.bind]/10

Значения связанных аргументов v1, v2,..., vN и их соответствующие типы v1, v2,..., vN зависят от типов TDi, полученных от вызова на bind и cv-квалификаторы cv оболочки обхода g следующим образом:
...
— если значение j of is_­placeholder_­v<TDi> не равно нулю, аргумент std​::​forward<Uj>(uj) и его тип Vi равен Uj&&;