
I've noticed test failures when compiling some of boost in C++0x mode due to the change to boost::result_of to use decltype. The problem comes from function objects like this: template<class T> struct identity { typedef T result_type; T const & // <== problem here operator()(T const &t) const { return t; } }; In this (overly simplistic) example, we just want to return what is passed in. The computed type (result_type) is different than the return type of operator() ... and for a good (IMO) reason: to avoid an unnecessary copy in some cases. The idea is to accommodate usage like this: result_of<identity(BigObj)>::type i = identity()(BigObj()); It is really very important that decltype(i) be BigObj, and not BogObj const &, which would cause a dangling reference. But with the change to use decltype in boost::result_of, the dangling reference is exactly what I would get. Am I now forced to change identity::operator() return by value here? That seems sub-optimal to me. In many other potential uses of identity (e.g., when forwarding the result to some other function), the copy is totally unnecessary. -- Eric Niebler BoostPro Computing http://www.boostpro.com