2016-06-05 16 views
9

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?

cevap

7

GCC doğrudur. [temp.deduct.type]/17: P<i> içerir ve A arasında karşılık gelen değerin tipi i türünden farklı olursa, kesinti başarısız bir forma sahip

edin.

+1

Güzel ve doğrudan. [28010] olarak yayınlandı (https://llvm.org/bugs/show_bug.cgi?id=28010) – Barry