
I've noticed something odd about the specification of tr1::result_of. In result_of<F()>::type, if F is a class type that doesn't have a nested result_type typedef, the result is "void". This is only true for F(); that is, when there are no arguments. That leads to the following strangeness: struct foo { typedef int result_type; }; struct bar { template<class Sig> struct result { typedef int type; }; }; result_of<foo()>::type == int // 1 result_of<bar()>::type == void // 2 huh? result_of<foo(int)>::type == int // 3 result_of<bar(int)>::type == int // 4 This is the way it's specified in TR1, and boost::result_of implements this behavior faithfully, but I just can't understand why (2) is void instead of int. Can somebody explain it to me? -- Eric Niebler Boost Consulting www.boost-consulting.com