Почему оба шаблона работают?
В первом шаблоне вы передаете Obj*
методу шаблона, принимая T*
, так что компилятор выводит, что T
Obj
.
Во втором шаблоне вы передаете Obj*
методу шаблона, принимая T
, поэтому компилятор определяет, что T
равно Obj*
.
Использование inline
inline
там избыточно, так как функции-члены определены внутри определения класса неявно inline
.
Использование const
Для функторов должно быть объявлено operator()
const
, если это возможно.Это потому, что нельзя передавать временные данные по неконстантной ссылке.Вызов std::for_each(...,..., Functor());
может не скомпилироваться, если только Functor
не имеет operator(T)const
.
Эта проблема запутана тем, что компиляторы Microsoft реализуют нестандартное расширение, позволяющее передавать временные значения не-const и включите это нестандартное поведение по умолчанию.