Parcialmente especializado em parâmetro de modelo não-tipo do tipo errado

Considere o seguinte:

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 o código, o gcc não.

No entanto, no seguinte exemplo altamente relacionado:

template <unsigned >
struct uint_ { };

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

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

ambos os compiladores rejeitam sem nenhuma chamada de função correspondente parafoo. O comportamento do gcc é consistente e o do clang não - portanto, um ou outro compilador possui um bug para um ou ambos os exemplos. Qual compilador está correto?

questionAnswers(1)

yourAnswerToTheQuestion