Другие ответы уже объясняли вам, что проблема в вашем случае заключается в том, что объект функтора передается в for_each
и возвращается из for_each
по значению .
Однако, пока этоВерно, что объявление for_each
отвечает за это поведение, последнее слово сказано механизмом вывода аргументов шаблона C ++.В соответствии с правилами языка, в этом вызове
for_each(list.begin(), list.end(), concatenator);
второй аргумент шаблона for_each
выводится как Concatenator
, а не как Concatenator &
, что приводит к семантике передачи по значению.
Вы можете переопределить вычет, явно указав аргументы шаблона, указав тип ссылки для второго аргумента шаблона
for_each<vector<string>::iterator, Concatenator &>(ist.begin(), list.end(),
concatenator);
Это полностью исключит копирование и заменит семантику pass-by_valueс семантикой передачи по ссылке (также охватывающей возвращаемое значение for_each
).Это не выглядит элегантно, особенно потому, что тип функтора является аргументом шаблона second , но это обходной путь.