http://gcc.gnu.org/bugzilla/show_bug.cgi?id=49058
--- Comment #16 from Paolo Carlini <paolo.carlini at oracle dot com> 2011-05-22 22:52:13 UTC --- With enable_if becomes a tad more concise. /////////////////// Index: include/std/functional =================================================================== --- include/std/functional (revision 174044) +++ include/std/functional (working copy) @@ -1210,7 +1210,8 @@ // Call as const template<typename... _Args, typename _Result - = decltype( std::declval<const _Functor>()( + = decltype( std::declval<typename enable_if<(sizeof...(_Args) >= 0), + typename add_const<_Functor>::type>::type>()( _Mu<_Bound_args>()( std::declval<const _Bound_args&>(), std::declval<tuple<_Args...>&>() )... ) )> _Result @@ -1223,7 +1224,8 @@ // Call as volatile template<typename... _Args, typename _Result - = decltype( std::declval<volatile _Functor>()( + = decltype( std::declval<typename enable_if<(sizeof...(_Args) >= 0), + typename add_volatile<_Functor>::type>::type>()( _Mu<_Bound_args>()( std::declval<volatile _Bound_args&>(), std::declval<tuple<_Args...>&>() )... ) )> _Result @@ -1236,7 +1238,8 @@ // Call as const volatile template<typename... _Args, typename _Result - = decltype( std::declval<const volatile _Functor>()( + = decltype( std::declval<typename enable_if<(sizeof...(_Args) >= 0), + typename add_cv<_Functor>::type>::type>()( _Mu<_Bound_args>()( std::declval<const volatile _Bound_args&>(), std::declval<tuple<_Args...>&>() )... ) )> _Result