
David Abrahams wrote:
Eric Niebler wrote:
David Abrahams wrote:
Eric Niebler wrote:
David Abrahams wrote:
Eric Niebler wrote:
-- snip 2^10 overloads --
Yeah, that's probably too much, but I'm not sure we have to support forwarding for that many arguments. The only thing rvalue forwarding buys you (and it can be a big win) is the ability for the wrapped thing to make certain optimizations. It's a good idea when you can do it. If you can't do it, you can fall back to lvalues and in C++03 you've still done a credible job. Even 2^3 overloads has a *very* noticeable effect on compile times. 8 overloads hurts compile times? Yes, because for each function invocation you have to calculate the return type 8x in 8 different ways.
Hmm. Why? Seems to me that only one specialization of the wrapped class template needs to be instantiated per invocation.
Take the simple case with 1 arg: template<typename T> typename result_of<F(T &)>::type fun( T & t ); template<typename T> typename result_of<F(T const &)>::type fun( T const & t ); Now I invoke fun(x). The compiler has to do overload resolution. First it has to determine function signatures. In so doing, it computes the return type for both overloads. For 3 arguments there are 8 overloads and the return type needs to be calculated 8x in 8 different ways, even though only one will ever be used. <snip the rest, which I need to think more about> -- Eric Niebler BoostPro Computing http://www.boostpro.com