По какой-то причине ваш код оценивает boost::format("%10d") % bl::_1
сразу, а не при каждом вызове лямбды.
Чтобы предотвратить это, вам нужно обернуть boost::format("%10d")
в вызове bl::var
, простокак вы сделали с std::cout
.
К сожалению, для этого требуется Boost.Lambda для определения типа возврата вызова operator%
, что он не может сделать.Поэтому тип возвращаемого значения должен быть указан явно, используя bl::ret
.Обратите внимание, что этот возвращаемый тип должен быть ссылкой, чтобы std::cout
обращался к возвращенному объекту напрямую, а не к его копии.
Таким образом, мы получаем следующий код, который выдает ожидаемый результат:
std::for_each(v.begin(), v.end(), bl::var(std::cout) <<
bl::ret<const boost::format &>(bl::var(boost::format("%10d")) % bl::_1));