message: make meta::and_ and meta::or_ SFINAE-friendly
diff: @@ -1125,31 +1125,38 @@ namespace meta
  /// \cond
  namespace detail
  {
  - template <typename... Bools>
  - struct _and_;
  + template <bool>
  + struct _and_
  + {
  + template <class = void>
  + using invoke = std::true_type;
  + };
  template <>
  - struct _and_<> : std::true_type
  + struct _and_<false>
  {
  + template <typename Bool_, typename... Bools>
  + using invoke = invoke<
  + if_c<!Bool_::type::value,
  + id<std::false_type>,
  + _and_<0==sizeof...(Bools)>>, Bools...>;
  };
  - template <typename Bool_, typename... Bools>
  - struct _and_<Bool_, Bools...>
  - : if_c<!Bool_::type::value, std::false_type, _and_<Bools...>>
  + template <bool>
  + struct _or_
  {
  + template <class = void>
  + using invoke = std::false_type;
  };
  - template <typename... Bools>
  - struct _or_;
  -
  template <>
  - struct _or_<> : std::false_type
  + struct _or_<false>
  {
  - };
  -
  template <typename Bool_, typename... Bools>
  - struct _or_<Bool_, Bools...> : if_c<Bool_::type::value, std::true_type, _or_<Bools...>>
  - {
  + using invoke = invoke<
  + if_c<Bool_::type::value,
  + id<std::true_type>,
  + _or_<0 == sizeof...(Bools)>>, Bools...>;
  };
  } // namespace detail
  /// \endcond
  @@ -1189,8 +1196,9 @@ namespace meta
  /// \e with
  /// short-circuiting.
  /// \ingroup logical
  + // Make a trip through defer<> to avoid CWG1430
  template <typename... Bools>
  - using and_ = _t<detail::_and_<Bools...>>;
  + using and_ = _t<defer<detail::_and_<0 == sizeof...(Bools)>::template invoke, Bools...>>;
  /// Logically or together all the Boolean parameters
  /// \ingroup logical
  @@ -1209,8 +1217,9 @@ namespace meta
  /// \e with
  /// short-circuiting.
  /// \ingroup logical
  + // Make a trip through defer<> to avoid CWG1430
  template <typename... Bools>
  - using or_ = _t<detail::_or_<Bools...>>;
  + using or_ = _t<defer<detail::_or_<0 == sizeof...(Bools)>:: template invoke, Bools...>>;
  namespace lazy
  {
  