Вот как у меня for_each в моей системе:
template<class _InIt,
class _Fn1> inline
_Fn1 _For_each(_InIt _First, _InIt _Last, _Fn1 _Func)
{ // perform function for each element
for (; _First != _Last; ++_First)
_Func(*_First);
return (_Func); // a copy could be created here (C3)
}
template<class _InIt,
class _Fn1> inline
_Fn1 for_each(_InIt _First, _InIt _Last, _Fn1 _Func)
{ // perform function for each element
_DEBUG_RANGE(_First, _Last);
_DEBUG_POINTER(_Func);
return (_For_each(_Unchecked(_First), _Unchecked(_Last), _Func)); // a copy created here (C2)
}
Итак, по сути, вот как может выглядеть
for_each(v.begin() , v.end() , print()); // print functor created (constructor)
// a copy created here (C1)
Теперь это полностью зависит от реализации, если копирование выполнено или нет. Стандарт позволяет этой широте исключать конструктор копирования, например, C3 может быть устранен.
Хороший способ управления поведением gcc здесь - это -fno-elide-constructors , который гарантирует, что код не исключает конструктор копирования