Seems like the following specialization of impl<> works:
template <typename r>
struct impl<true, r(void)>
{
static const bool value =
sizeof(
return_value_check<type, r>::deduce( (
(((derived_type*)0)->operator()(), details::void_exp_result<type>())
) )
) == sizeof(yes);
};