I have just read the classic book \"Effective C++, 3rd Edition\", and in item 20 the author concludes that built-in types, STL iterators and function object types ar
The #1 reason to pass function objects by value is because the standard library requires that function objects you pass to its algorithms be copyable. C++11 §25.1/10:
[ Note: Unless otherwise specified, algorithms that take function objects as arguments are permitted to copy those function objects freely. Programmers for whom object identity is important should consider using a wrapper class that points to a noncopied implementation object such as
reference_wrapper(20.8.3), or some equivalent solution. —end note ]
The other answers do a great job of explaining the rationale.