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).
Fabien LE LEZ <gramster@gramster.com> 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).
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).
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 --
Gabriel Dos Reis <dosreis@cmla.ens-cachan.fr> writes:
fabien.chene.invalid@nospam.laposte.net
| 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)
| 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)