Ответ 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
ofis_placeholder_v<TDi>
не равно нулю, аргументstd::forward<Uj>(uj)
и его типVi
равенUj&&
;