9 votes

Une implémentation est-elle nécessaire pour diagnostiquer les violations ODR des définitions dupliquées de la même spécialisation explicite dans la même UT ?

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>

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X