Considérons une entité modélisée, disons (A) un modèle de fonction, et (B) un enum membre d'un modèle de classe.
// (A)
template<auto>
int f();
// (B)
template <auto>
struct T { enum class E; };
Une implémentation doit-elle diagnostiquer les violations de l'ODR dues à la duplication des définitions de la même spécialisation explicite d'une telle entité modèle ? Ou, en d'autres termes, est-ce que [basic.def.odr]/1 postuler pour des spécialisations explicites ?
Par exemple, GCC et Clang diagnostiquent tous deux le programme suivant comme étant mal formé :
// Single translation unit;
// primary template of 'f' declared as in (A) above.
template<>
int f<0>() { return 0; }
template<>
int f<0>() { return 1; }
// GCC & Clang - error: redefinition of 'int f() [with auto <anonymous> = 0]'
alors que seul Clang diagnostique le programme suivant comme étant mal formé, alors que GCC l'accepte :
// Single translation unit;
// primary template of 'T' defined as in (B) above.
template<>
enum class T<0>::E { ex };
template<>
enum class T<0>::E { ey };
// Clang only - error: redefinition of 'E'
NDR mal formé, ou mal formé ? (/les deux compilateurs sont corrects, ou bug de GCC ?)
<em>Testé sur différentes versions de GCC et Clang, pour <code>-std=c++17</code> y <code>-std=c++2a</code> avec le même résultat</em>