Considérer ce qui suit:
template struct uint_ { }; template struct X { static constexpr bool value = false; }; template // NB: int, not unsigned struct X<uint_> { static constexpr bool value = true; }; int main() { static_assert(X<uint_>::value, "!"); }
Clang comstack le code, pas gcc.
Cependant, dans l’exemple suivant hautement lié:
template struct uint_ { }; template // NB: int, not unsigned void foo(uint_ ) { } int main() { foo(uint_{} ); }
les deux compilateurs rejettent sans appel de fonction correspondante à foo
. Le comportement de gcc est cohérent, pas celui de clang, donc l’un des compilateurs a un bogue pour l’un des exemples. Quel compilateur est correct?
GCC est correct. [temp.deduct.type] / 17 :
Si
P
a une forme contenant, et si le type de la valeur correspondante de
A
diffère du type dei
, la déduction échoue.