Si consideri il seguente:parzialmente specializzata in materia di non-tipo di parametro template del tipo sbagliato
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 il codice, gcc non lo fa.
Tuttavia, nel seguente esempio altamente corrispondenti
template <unsigned >
struct uint_ { };
template <int I> // NB: int, not unsigned
void foo(uint_<I>) { }
int main() {
foo(uint_<0>{});
}
entrambi compilatori respingono senza alcuna funzione di corrispondenza chiamata foo
. Il comportamento di gcc è coerente, Clang's non lo è, quindi uno o l'altro compilatore ha un bug per uno o entrambi gli esempi. Quale compilatore è corretto?
Bello e diretto. Archiviato come [28010] (https://llvm.org/bugs/show_bug.cgi?id=28010) – Barry