Template alias SFINAE && param pack expansion in function types

utility::always_void was changed with regard to 
http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#1558

detail::\_reduce\_if_ and detail::\_replace\_if_ were changed as to avoid disagreement about param pack expansion in
that context.

http://gcc.gnu.org/bugzilla/show_bug.cgi?id=57384