http://gcc.gnu.org/bugzilla/show_bug.cgi?id=51710

--- Comment #1 from Jonathan Wakely <redi at gcc dot gnu.org> 2011-12-30 
12:53:27 UTC ---
I think the code is invalid because the expression decltype(foo(e1,e2)) does
not occur in the "immediate context" of the function type

It works if you replace enable_if<cond, decltype(expr)> with
enable_if_foo<cond, type> where enable_if_foo evaluates decltype(expr)

template<bool, typename E1, typename E2>
struct enable_if_foo
{
  typedef decltype(foo(std::declval<E1>(), std::declval<E2>())) type;
};

template<typename E1, typename E2>
struct enable_if_foo<false, E1, E2>
{ };

/// operator+ is overloaded for E1,E2 satisfying some_condition only
template <typename E1, typename E2>
inline auto operator+(E1&& e1, E2&& e2)
        -> typename enable_if_foo<
               some_condition<E1,E2>::value, // We check condition
               E1, E2
           >::type
{
    return foo(e1, e2);
}

Reply via email to