Parcialmente especializado en parámetros de plantilla que no son de tipo incorrecto

Considera lo siguiente:

template <unsigned >
struct uint_ { };

template <class >
struct X {
    static constexpr bool value = false;
};

template <int I> // NB: int, not unsigned
struct X<uint_<I>> {
    static constexpr bool value = true;
};

int main() {
    static_assert(X<uint_<0>>::value, "!");
}

clang compila el código, gcc no.

Sin embargo, en el siguiente ejemplo altamente relacionado:

template <unsigned >
struct uint_ { };

template <int I> // NB: int, not unsigned
void foo(uint_<I> ) { }

int main() {
    foo(uint_<0>{} );
}

ambos compiladores rechazan sin llamada de función coincidente afoo. El comportamiento de gcc es consistente, el de clang no lo es, por lo que uno u otro compilador tiene un error para uno o ambos ejemplos. ¿Qué compilador es correcto?

Respuestas a la pregunta(1)

Su respuesta a la pregunta