Частично специализируется на нетипичных параметрах шаблона неправильного типа

Учтите следующее:

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 компилирует код, gcc - нет.

Тем не менее, в следующем тесно связанном примере:

template <unsigned >
struct uint_ { };

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

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

оба компилятора отклоняются без соответствующего вызова функцииfoo, Поведение gcc непротиворечиво, а clang - нет, поэтому у одного или другого компилятора есть ошибка для одного или обоих примеров. Какой компилятор правильный?

Ответы на вопрос(1)

Ваш ответ на вопрос