http://gcc.gnu.org/bugzilla/show_bug.cgi?id=58569
--- Comment #9 from Jonathan Wakely <redi at gcc dot gnu.org> --- Somewhat reduced: #include <type_traits> template<typename _Functor> inline _Functor& __callable_functor(_Functor& __f) { return __f; } template<typename S> struct Function; template<typename R, typename... A> struct Function<R(A...)> { template<typename F> using Invoke = decltype(__callable_functor(std::declval<F&>()) (std::declval<A>()...) ); template<typename CallRes, typename Res1> struct CheckResult : std::is_convertible<CallRes, Res1> { }; // template<typename CallRes> struct CheckResult<CallRes, CallRes> : std::true_type { }; template<typename F> using Callable = CheckResult<Invoke<F>, R>; template<typename Cond, typename T> using Requires = typename std::enable_if<Cond::value, T>::type; template<typename F, typename = Requires<Callable<F>, void>> Function(F); Function(); R operator()(A...) const; }; struct foo { Function<foo (int)> x; Function<foo ()> y; }; int main() { foo a; }