aşağıdaki düşünün yanlış türde olmayan tip şablon parametresine uzmanlaşmış:Kısmen
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 kodunu derler, gcc yapmaz. Aşağıdaki yüksek derecede önemli örnekte Ancak
:
template <unsigned >
struct uint_ { };
template <int I> // NB: int, not unsigned
void foo(uint_<I>) { }
int main() {
foo(uint_<0>{});
}
iki Derleyiciler foo
için uygun işlev çağrısı ile reddeder. gcc'nin davranışı tutarlı, clang's değil - yani bir veya diğer derleyici bir veya her iki örnek için bir hata vardır. Hangi derleyici doğrudur?
Güzel ve doğrudan. [28010] olarak yayınlandı (https://llvm.org/bugs/show_bug.cgi?id=28010) – Barry