OVH Cloud OVH Cloud

[G++] new et POD contenant un membre const

12 réponses
Avatar
fabien.chene.invalid
Bonjour,

Je pense que le code suivant n'est pas valide :

struct Foo // POD
{=20=20=20=20
int i;
double const d;
};

int main()
{
Foo* foo =3D new Foo; // noter l'absence de new-initializer
}

5.3.4.15 me parait assez explicite. Commeau online me conforte dans
mon opinion, et produit une erreur =E0 la compilation.

G++, quand =E0 lui (3.4.4 et 4.0.2 au moins), accepte ce code sans
sourciller. Est-ce un bug ?

Merci


-- fab --

2 réponses

1 2
Avatar
fabien.chene.invalid
Fabien LE LEZ writes:


struct Foo // POD
{
double const d;


Et comment veux-tu donner une valeur à d ?

Ce n'est pas possible dans le constructeur, puisqu'il n'y a pas de
constructeur.


S'il n'y a pas de constructeur déclaré par l'utilisateur, il y en un
d'implicitement déclaré inline, puis défini si "utilisé".

Si on construit un Foo en utilisant un new-initializer (via new
forcément), Foo est value-initialisé, et d est alors zéro-initialis é.
Donc d prend la valeur 0 et est const.

Sans le new-initilizer, d est const et prend une valeur
indéterminée. L'intérêt me parait extrèmement faible ... Le fait que
la norme l'interdise me parait logique (Si j'ai bien compris).


Avatar
fabien.chene.invalid
Gabriel Dos Reis writes:



| Bonjour,
|
| Je pense que le code suivant n'est pas valide :
|
| struct Foo // POD
| {
| int i;
| double const d;
| };
|
| int main()
| {
| Foo* foo = new Foo; // noter l'absence de new-initializer
| }
|
| 5.3.4.15 me parait assez explicite. Commeau online me conforte dans
| mon opinion, et produit une erreur à la compilation.
|
| G++, quand à lui (3.4.4 et 4.0.2 au moins), accepte ce code sans
| sourciller. Est-ce un bug ?

Bug dans GCC/g++.


Même pas une regression apparemment (!)
Bizarre pour un bout de code "presque" commun :)

(le lien vers le rapport de bug est quelques posts plus haut)


-- fab --

1 2