SFINAE não está acontecendo com std :: subjac_type

Abaixo do código SFINAE com modelos variadic compila bem usando o clang 3.7.1, C ++ 14:

#include <array>
#include <iostream>
#include <vector>
#include <cstdint>

enum class Bar : uint8_t {
    ay, bee, see
};

struct S {

static void foo() {}

// std::begin(h) is defined for h of type H
template<typename H, typename... T>
static typename std::enable_if<std::is_pointer<decltype(std::begin(std::declval<H>()))*>::value>::type 
foo(const H&, T&&... t) 
{ std::cout << "container\n"; foo(std::forward<T>(t)...); }

// H is integral
template<typename H, typename... T>
static typename std::enable_if<std::is_integral<typename std::remove_reference<H>::type>::value>::type 
foo(const H&, T&&... t) 
{ std::cout << "integer\n"; foo(std::forward<T>(t)...); }

// H is an enum with underlying type = uint8_t
/*
template<typename H, typename... T>
static typename std::enable_if<std::is_same<typename std::underlying_type<H>::type,uint8_t>::value>::type 
foo(const H&, T&&... t)
{ std::cout << "enum\n"; foo(std::forward<T>(t)...); }
*/
};


int main()
{
    S::foo(std::array<int,8>(), 5, 5L, std::vector<int>{}, 5L);
}

Eu quero a sobrecarga correta defoo ser chamado recursivamente, com base no tipoH:

E sestd::begin(h) é definido para umh do tipoH, Quero que a sobrecarga número 1 seja escolhidaE seH é um "tipo integral", quero o número de sobrecarga 2.

Isso funciona como está. Mas se eu adicionar outra sobrecarga paraenum tipos (você pode tentar cancelar o comentário da terceira sobrecarga), então eu obtenho:

erro: apenas tipos de enumeração têm tipos subjacentes

Eu concordo que apenasenums tem um tipo subjacente, por isso não é a terceira sobrecarga (comstd::underlying_type) afaste o SFINAE-d?

questionAnswers(2)

yourAnswerToTheQuestion