Ian McCulloch wrote:
Peter Dimov wrote:
Peter Dimov wrote:
Ian McCulloch wrote:
Peter Dimov wrote:
[...]
I don't get it: can't you detect whether nested::result
::type exists? As long as the primary template of nested::result is defined as an empty struct this should work fine(?). No, consider what happens when 'nested' is int (*) (), for example.
Hm, it can't be int (*) (), because result_of will not attempt to look for a nested result, but it can be an user-defined type with no nested result, or a member named result.
Wouldn't both those cases (no nested result, or a member named result) cause a substitution failure?
Allowed but not required by 14.8.2/2, I think.
template <typename T> typename T::result
::type func(T const& x) { std::cout << "func(T const&)\n"; return typename T::result ::type(); }
There should be a "template" before "result".
This compiles cleanly with g++ 3.3.4
Yes, it also works on MSVC 7.1 and (with "template" added before "result")
on Comeau 4.3.0.1 strict, so it seems that this is a "supported" case of
substitution failure. However tr1::result_of implementations aren't required
to use this trick (which, to the best of my knowledge, hasn't been
publicized anywhere so far) to not generate errors when
::result