41 votes

GCC accepte `constexpr struct {} s;` mais Clang le rejette. Qui a raison ?

Le code suivant se compile bien avec GCC :

constexpr struct {} s;

Mais Clang le rejette avec l'erreur suivante :

Erreur : initialisation par défaut d'un objet de type const 'const struct (anonymous struct at )' sans constructeur par défaut fourni par l'utilisateur.

J'ai testé toutes les versions de GCC et Clang que j'ai pu trouver à https://gcc.godbolt.org/ . Chaque version de GCC accepte le code et chaque version de Clang le rejette.

Je me demande quel compilateur est correct dans ce cas ?
Que dit la norme à ce sujet ?

40voto

Columbo Points 11661

Clang adhère au passage suivant dans [dcl.init]/7 :

Si un programme demande l'initialisation par défaut d'un objet d'un type qualifié de const. T , T doit être un type de classe avec un constructeur par défaut fourni par l'utilisateur.

Cette formulation est défectueux y donc ignoré par GCC (et, à partir de la v3.9, également par Clang ).
La citation ci-dessus diffère du numéro de base 253's en raison de <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2762.htm" rel="noreferrer">N2762 </a>déplacement/ajustement du paragraphe 9 tel que cité.

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