Boost logo

Boost :

Subject: [boost] [result_of] decltype and function objects
From: Eric Niebler (eric_at_[hidden])
Date: 2008-11-13 19:43:57

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

Boost list run by bdawes at, gregod at, cpdaniel at, john at