 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
amerio Guest
|
Posted: Tue Jul 08, 2003 11:20 am Post subject: 'this' : used in base member initializer list |
|
|
Bonjour,
Mon pb doit est le suivant : une classe doit initialisé un de ses membres
avec un pointeur dur elle même :
class B
{
public:
B(class A* pA) : m_pA(pA) {}
private:
class A* m_pA;
}
class A
{
public:
A() : m_B(this) {} // warning 'this' : used in base member
initializer list
private:
const B m_B;
}
Comment eviter le warning (sous VC6) (et d'abord, dois je l'éviter ou
changer de technique ? quel est le risque ?)
Au passage, boost:: utilise cette technique, cf
http://www.boost.org/libs/smart_ptr/sp_techniques.html#weak_without_shared
|
|
| Back to top |
|
 |
David Brabant Guest
|
Posted: Tue Jul 08, 2003 12:08 pm Post subject: Re: 'this' : used in base member initializer list |
|
|
"amerio" <amerio (AT) hotmail (DOT) com> wrote
| Quote: | Comment eviter le warning (sous VC6)
|
#pragma warning(disable: 4355)
--
David
|
|
| Back to top |
|
 |
amerio Guest
|
Posted: Tue Jul 08, 2003 12:32 pm Post subject: Re: 'this' : used in base member initializer list |
|
|
| Quote: | Comment eviter le warning (sous VC6)
#pragma warning(disable: 4355)
|
Humm, oui, , mais ce n'etait pas là ma question.
C'etait plutot : est-ce dangereux (ou non-portable) ?
|
|
| Back to top |
|
 |
drkm Guest
|
Posted: Tue Jul 08, 2003 9:33 pm Post subject: Re: 'this' : used in base member initializer list |
|
|
"amerio" <amerio (AT) hotmail (DOT) com> writes:
| Quote: | class B
{
public:
B(class A* pA) : m_pA(pA) {}
private:
class A* m_pA;
C'est quoi exactement, ce truc ? Avec "typename" j'aurais compris,
mais tel quel, je ne vois pas à quoi ça correspond.
Ecrire class A; avant c'est pareil que redire que A est une classe à
chaque fois (ou typename, c'est kifkif) (plus lourd, peut etre, mais
là l'est pas mon pb !) Mon pb, c'est de savoir si oui ou non il est
risqué (ou non portable) d'utiliser 'this' dans la liste
d'initialisation des membres.
|
Oui, cfr. le message :
Subject: Utilisation de `this´ dans `ctor-initializer´
Date: 20 May 2003 04:17:15 +0200
Message-ID: <wksmra745w.fsf (AT) yahoo (DOT) fr>
En même temps, en cherchant un peu dans la norme, j'ai trouvé ceci :
9.3.2/1
In the body of a nonstatic (9.3) member function, the keyword
`this´ is a non-lvalue expression whose value is the address of
the object for which the function is called.
12.6.2/4
[...] if a member of X is neither specified in the constructor's
`mem-initializers´, nor default-initialized, nor initialized
during execution of the body of the constructor [...]
Le premier extrait dit clairement que `this´ est utilisable dans le
*corps* d'une fonction membre non-statique, alors que le second
/semble/ faire une différence entre le corps d'un constructeur et son
`ctor-initializer´.
Je n'ai cependant pas réussi à trouver un passage clair sur
l'appartenance ou non du `ctor-initializer´ au corps de son
constructeur. S'il devait s'avérer qu'il n'y appartient pas, il ne
serait alors pas possible d'y utiliser `this´, non ?
--drkm
|
|
| Back to top |
|
 |
drkm Guest
|
Posted: Tue Jul 08, 2003 10:14 pm Post subject: Re: 'this' : used in base member initializer list |
|
|
"amerio" <amerio (AT) hotmail (DOT) com> writes:
| Quote: | class B
{
public:
B(class A* pA) : m_pA(pA) {}
private:
class A* m_pA;
C'est quoi exactement, ce truc ? Avec "typename" j'aurais compris,
mais tel quel, je ne vois pas à quoi ça correspond.
Ecrire class A; avant c'est pareil que redire que A est une classe à
chaque fois (ou typename, c'est kifkif) (plus lourd, peut etre, mais
là l'est pas mon pb !) Mon pb, c'est de savoir si oui ou non il est
risqué (ou non portable) d'utiliser 'this' dans la liste
d'initialisation des membres.
|
J'ajouterais que le code suivant compile parfaitement sous GCC, sans
diagnostique :
| Quote: | cat fclc++.cc
#include |
class B
{
public:
B( class A* pA ) : m_pA( pA ) { }
class A* m_pA ;
} ;
class A
{
public:
A() : m_B( this ) { }
const B m_B ;
} ;
int main()
{
A a ;
std::cout << a.m_B.m_pA << ' ' << & a << std::endl ;
return 0 ;
}
| Quote: | g++ --version
g++ (GCC) 3.2 20020818 (prerelease) |
Copyright (C) 2002 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR
A PARTICULAR PURPOSE.
| Quote: | g++ -o fclc++ fclc++.cc -Wall -ansi -pedantic
./fclc++
0x76fd54 0x76fd54 |
--drkm
|
|
| Back to top |
|
 |
kanze@gabi-soft.fr Guest
|
Posted: Wed Jul 09, 2003 9:28 am Post subject: Re: 'this' : used in base member initializer list |
|
|
drkm <darkman_spam (AT) yahoo (DOT) fr> wrote
| Quote: | "amerio" <amerio (AT) hotmail (DOT) com> writes:
class B
{
public:
B(class A* pA) : m_pA(pA) {}
private:
class A* m_pA;
C'est quoi exactement, ce truc ? Avec "typename" j'aurais compris,
mais tel quel, je ne vois pas à quoi ça correspond.
Ecrire class A; avant c'est pareil que redire que A est une classe à
chaque fois (ou typename, c'est kifkif) (plus lourd, peut etre, mais
là l'est pas mon pb !) Mon pb, c'est de savoir si oui ou non il est
risqué (ou non portable) d'utiliser 'this' dans la liste
d'initialisation des membres.
J'ajouterais que le code suivant compile parfaitement sous GCC, sans
diagnostique :
|
Et pourtant, ce n'est pas légal:-).
| Quote: | cat fclc++.cc
#include <iostream
|
Tu as oublié l'« #include
définis.
| Quote: | class B
{
public:
B( class A* pA ) : m_pA( pA ) { }
class A* m_pA ;
} ;
class A
{
public:
A() : m_B( this ) { }
const B m_B ;
} ;
|
Ajoutons un:
class C : public A
{
public:
C() : unDeuxiemeB( this ) {}
B const unDeuxiemeB ;
} ;
G++ ne dit toujours rien. Et pourtant, c'est illégal. La conversion de
this (un C*) en A* a un comportement indéfini.
En fait, il y a de fortes chances que ça marche, tant qu'il n'y a pas
d'héritage virtuel. Mais la norme l'interdit explicitement.
| Quote: | int main()
{
A a ;
std::cout << a.m_B.m_pA << ' ' << & a << std::endl ;
return 0 ;
}
g++ --version
g++ (GCC) 3.2 20020818 (prerelease)
Copyright (C) 2002 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR
A PARTICULAR PURPOSE.
g++ -o fclc++ fclc++.cc -Wall -ansi -pedantic
./fclc++
0x76fd54 0x76fd54
|
Le fait que quelque chose marche avec un compilateur donné ne prouve pas
qu'il soit légal. Dans le cas en question, c'est légal, mais seulement
parce que le constructeur qui a reçu le paramètre ne fait que le copier.
Changer ce constructeur, g++ ne râlera toujours pas, mais le code ne
serait plus correct.
--
James Kanze GABI Software mailto:kanze (AT) gabi-soft (DOT) fr
Conseils en informatique orientée objet/ http://www.gabi-soft.fr
Beratung in objektorientierter Datenverarbeitung
11 rue de Rambouillet, 78460 Chevreuse, France, +33 (0)1 30 23 45 16
|
|
| Back to top |
|
 |
drkm Guest
|
Posted: Wed Jul 09, 2003 12:58 pm Post subject: Re: 'this' : used in base member initializer list |
|
|
[email]kanze (AT) gabi-soft (DOT) fr[/email] writes:
| Quote: | drkm <darkman_spam (AT) yahoo (DOT) fr> wrote in message
news:<wkisqcu0mm.fsf (AT) yahoo (DOT) fr>...
J'ajouterais que le code suivant compile parfaitement sous GCC,
sans diagnostique :
Et pourtant, ce n'est pas légal:-).
cat fclc++.cc
#include <iostream
Tu as oublié l'« #include
définis.
|
Yep. Je ne prend jamais la « peine » de l'inclure dans des petits
tests rapides, et bien sûr, ne pense pas à l'ajouter si je poste le
code .
| Quote: | class B
{
public:
B( class A* pA ) : m_pA( pA ) { }
class A* m_pA ;
} ;
class A
{
public:
A() : m_B( this ) { }
const B m_B ;
} ;
Ajoutons un:
class C : public A
{
public:
C() : unDeuxiemeB( this ) {}
B const unDeuxiemeB ;
} ;
G++ ne dit toujours rien. Et pourtant, c'est illégal. La conversion
de this (un C*) en A* a un comportement indéfini.
|
Yep.
| Quote: | En fait, il y a de fortes chances que ça marche, tant qu'il n'y a
pas d'héritage virtuel. Mais la norme l'interdit explicitement.
|
Je ne vois pas exactement comment l'héritage virtuel complique
l'affaire. Lors d'une conversion entre deux types d'une même
hiérarchie avec héritage virtuel, il est possible que le compilateur
doive ajouter ou retrancher un petit décalage à la valeur du pointeur.
Et si je comprend bien, la valeur de ce décalage est connue dès que
les types sont connus (ce qui est le cas dans une conversion).
Si l'on a l'adresse d'un objet, on peux calculer celle d'un
sous-objet ou sur-objet, indépendamment que ces objets soient ou non
construits (les adresses sont donc plutôt celles d'endroits où se
*trouveraient* les objets).
Mais je ne suis pas du tout spécialiste en ces affaires. Ai-je
manqué une marche ?
| Quote: | int main()
{
A a ;
std::cout << a.m_B.m_pA << ' ' << & a << std::endl ;
return 0 ;
}
g++ --version
g++ (GCC) 3.2 20020818 (prerelease)
Copyright (C) 2002 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.
There is NO warranty; not even for MERCHANTABILITY or FITNESS
FOR A PARTICULAR PURPOSE.
g++ -o fclc++ fclc++.cc -Wall -ansi -pedantic
./fclc++
0x76fd54 0x76fd54
Le fait que quelque chose marche avec un compilateur donné ne prouve
pas qu'il soit légal. Dans le cas en question, c'est légal, mais
seulement parce que le constructeur qui a reçu le paramètre ne fait
que le copier. Changer ce constructeur, g++ ne râlera toujours pas,
mais le code ne serait plus correct.
|
Bien sûr. C'est pour cela que l'article commence par « J'ajouterais
que le code suivant ... », en complément de l'article que j'avais
posté juste avant. Il ne voulais bien sûr pas servir de preuve, mais
plutôt d'illustration du comportement d'un autre compilateur.
--drkm
|
|
| Back to top |
|
 |
drkm Guest
|
Posted: Wed Jul 09, 2003 1:25 pm Post subject: Re: 'this' : used in base member initializer list |
|
|
[email]kanze (AT) gabi-soft (DOT) fr[/email] writes:
| Quote: | drkm <darkman_spam (AT) yahoo (DOT) fr> wrote in message
news:<wkr850u2ip.fsf (AT) yahoo (DOT) fr>...
En même temps, en cherchant un peu dans la norme, j'ai trouvé
ceci :
9.3.2/1
In the body of a nonstatic (9.3) member function, the keyword
`this´ is a non-lvalue expression whose value is the address
of the object for which the function is called.
12.6.2/4
[...] if a member of X is neither specified in the
constructor's `mem-initializers´, nor default-initialized, nor
initialized during execution of the body of the constructor
[...]
Le premier extrait dit clairement que `this´ est utilisable dans
le *corps* d'une fonction membre non-statique, alors que le second
/semble/ faire une différence entre le corps d'un constructeur et
son `ctor-initializer´.
Je n'ai cependant pas réussi à trouver un passage clair sur
l'appartenance ou non du `ctor-initializer´ au corps de son
constructeur. S'il devait s'avérer qu'il n'y appartient pas, il ne
serait alors pas possible d'y utiliser `this´, non ?
Ce qui suggèrerait que l'utilisation de this dans la liste
d'initialisation serait illégale.
|
Oui. Si le `ctor-initializer´ ne fait pas partie du corps du
constructeur.
| Quote: | Tous les compilateurs le permettent, et je suis assez sûr que
c'était l'intention du comité de le permettra.
|
C'est ce que j'imagine. Mais ce ne serait pas, je pense, le premier
exemple de contradiction entre l'intention du comité et sa rédaction
dans la norme ...
D'autant que je ne vois pas de raison pour un compilateur de
connaître la valeur de `this´ dans le corps du constructeur (je veux
dire après l'accolade ouvrante) et non dans la liste d'initialistion.
| Quote: | Par la suite, il y a la question de ce qu'on peut faire avec this à
ce moment. Dans la liste d'intialisation, this est un pointeur à un
objet non encore construit. Ça nous amène à §3.8/5, qui précise ce
qu'on peut faire avec un tel pointeur.
|
Je comprend l'interdiction de conversion d'un pointeur vers un objet
de type non-POD, dans le cas d'opérateurs de conversion définis par
l'utilisateur. Mais je ne comprend pas la motivation derrière
l'interdiction de la conversion vers un type de classe de base. Comme
je l'ai dis dans mon dernier article, il me semble que la conversion
d'adresses d'objets dans la même hiérarchie ne requiérerait [*] pas
que les objets soient construits.
[*] Je parle du point de vue de ce que requérerait une
implémentation, non de ce que requière la norme.
| Quote: | Une des choses qu'on peut faire, c'est le copier -- le passer en
tant que paramétre est donc authorisé, et garanti à fonctionner. En
revanche, si on le passe, on peut supposer que le constructeur
auquel on l'a passé va en faire quelque chose avec lui. Si tout ce
qu'il fait, c'est de le copier, pour l'utiliser plut tard (comme
c'est le cas ici), pas de problème. S'il fait quelque chose de plus,
ne serait-ce que de le convertir en un pointeur à une classe de
base, il y a un comportement indéfini. C'est d'ailleur le sens de
l'avertissement de VC++ : a priori, tu ne sais pas ce que fait la
classe avec le pointeur que tu lui passe. C'est donc une source
potentielle d'un comportement indéfini.
Dans ce cas-ci, l'idiome est assez courant. Assez pour que je crois
Microsoft a eu tort d'émettre un avertissment, même si ça part d'un
bon sentiment.
|
Du moins, de l'émettre sans options particulières. Je le verrais
bien dans un mode « full warnings ». Un peu comme `-Weffc++´ peut
avec GCC nous submerger d'avertissements inutiles, ou en émettre de
très pertinents.
Mais j'aimerais savoir ce qu'il en est pour l'appartenance du
`ctor-initializer´ au corps du constructeur. Quelqu'un a-t-il une
piste ?
--drkm
|
|
| Back to top |
|
 |
kanze@gabi-soft.fr Guest
|
Posted: Thu Jul 10, 2003 8:41 am Post subject: Re: 'this' : used in base member initializer list |
|
|
drkm <darkman_spam (AT) yahoo (DOT) fr> wrote
| Quote: | kanze (AT) gabi-soft (DOT) fr writes:
drkm <darkman_spam (AT) yahoo (DOT) fr> wrote in message
news:<wkr850u2ip.fsf (AT) yahoo (DOT) fr>...
En même temps, en cherchant un peu dans la norme, j'ai trouvé
ceci :
9.3.2/1
In the body of a nonstatic (9.3) member function, the keyword
`this´ is a non-lvalue expression whose value is the address
of the object for which the function is called.
12.6.2/4
[...] if a member of X is neither specified in the
constructor's `mem-initializers´, nor default-initialized, nor
initialized during execution of the body of the constructor
[...]
Le premier extrait dit clairement que `this´ est utilisable dans
le *corps* d'une fonction membre non-statique, alors que le second
/semble/ faire une différence entre le corps d'un constructeur et
son `ctor-initializer´.
Je n'ai cependant pas réussi à trouver un passage clair sur
l'appartenance ou non du `ctor-initializer´ au corps de son
constructeur. S'il devait s'avérer qu'il n'y appartient pas, il ne
serait alors pas possible d'y utiliser `this´, non ?
Ce qui suggèrerait que l'utilisation de this dans la liste
d'initialisation serait illégale.
Oui. Si le `ctor-initializer´ ne fait pas partie du corps du
constructeur.
|
Ce que je crains, c'est que c'est parfois oui, parfois non, selon
l'auteur exact du passage.
| Quote: | Tous les compilateurs le permettent, et je suis assez sûr que
c'était l'intention du comité de le permettra.
C'est ce que j'imagine. Mais ce ne serait pas, je pense, le premier
exemple de contradiction entre l'intention du comité et sa rédaction
dans la norme ...
|
Certes. C'est ce qui arrive quand on veut faire trop, trop vite.
| Quote: | D'autant que je ne vois pas de raison pour un compilateur de
connaître la valeur de `this´ dans le corps du constructeur (je veux
dire après l'accolade ouvrante) et non dans la liste d'initialistion.
|
S'il ne connaît pas this dans la liste d'initialisation, comment fait-il
à passer le this aux constructeurs des sous-objets ?
| Quote: | Par la suite, il y a la question de ce qu'on peut faire avec this à
ce moment. Dans la liste d'intialisation, this est un pointeur à un
objet non encore construit. Ça nous amène à §3.8/5, qui précise ce
qu'on peut faire avec un tel pointeur.
Je comprend l'interdiction de conversion d'un pointeur vers un objet
de type non-POD, dans le cas d'opérateurs de conversion définis par
l'utilisateur. Mais je ne comprend pas la motivation derrière
l'interdiction de la conversion vers un type de classe de base. Comme
je l'ai dis dans mon dernier article, il me semble que la conversion
d'adresses d'objets dans la même hiérarchie ne requiérerait [*] pas
que les objets soient construits.
[*] Je parle du point de vue de ce que requérerait une
implémentation, non de ce que requière la norme.
|
En es-tu sûr ? Même dans le cas de l'héritage virtuel ? Même pour un
pointeur arbitraire. Parce que le langage ici parle d'un pointeur *vers*
l'objet ; on parle de this uniquement parce que c'est un pointeur vers
l'objet, et qu'il n'y a pas de régles pour le traiter à part.
| Quote: | Une des choses qu'on peut faire, c'est le copier -- le passer en
tant que paramétre est donc authorisé, et garanti à fonctionner. En
revanche, si on le passe, on peut supposer que le constructeur
auquel on l'a passé va en faire quelque chose avec lui. Si tout ce
qu'il fait, c'est de le copier, pour l'utiliser plut tard (comme
c'est le cas ici), pas de problème. S'il fait quelque chose de plus,
ne serait-ce que de le convertir en un pointeur à une classe de
base, il y a un comportement indéfini. C'est d'ailleur le sens de
l'avertissement de VC++ : a priori, tu ne sais pas ce que fait la
classe avec le pointeur que tu lui passe. C'est donc une source
potentielle d'un comportement indéfini.
Dans ce cas-ci, l'idiome est assez courant. Assez pour que je crois
Microsoft a eu tort d'émettre un avertissment, même si ça part d'un
bon sentiment.
Du moins, de l'émettre sans options particulières. Je le verrais
bien dans un mode « full warnings ». Un peu comme `-Weffc++´ peut
avec GCC nous submerger d'avertissements inutiles, ou en émettre de
très pertinents.
|
Je ne sais pas. Dans la doute, je crois que mettre un maximum
d'avertissements par défaut, ce n'est peut-être pas une mauvaise
politique. Après tout, le programmeur qui sait ce qu'il fait sait qu'il
faut lire la documentation, et spécifier exactement des avertissements
dont il a besoin.
| Quote: | Mais j'aimerais savoir ce qu'il en est pour l'appartenance du
`ctor-initializer´ au corps du constructeur. Quelqu'un a-t-il une
piste ?
|
Il faudra peut-être démander dans comp.std.c++.
--
James Kanze GABI Software mailto:kanze (AT) gabi-soft (DOT) fr
Conseils en informatique orientée objet/ http://www.gabi-soft.fr
Beratung in objektorientierter Datenverarbeitung
11 rue de Rambouillet, 78460 Chevreuse, France, +33 (0)1 30 23 45 16
|
|
| Back to top |
|
 |
kanze@gabi-soft.fr Guest
|
Posted: Thu Jul 10, 2003 9:00 am Post subject: Re: 'this' : used in base member initializer list |
|
|
drkm <darkman_spam (AT) yahoo (DOT) fr> wrote
| Quote: | kanze (AT) gabi-soft (DOT) fr writes:
drkm <darkman_spam (AT) yahoo (DOT) fr> wrote in message
news:<wkisqcu0mm.fsf (AT) yahoo (DOT) fr>...
J'ajouterais que le code suivant compile parfaitement sous GCC,
sans diagnostique :
Et pourtant, ce n'est pas légal:-).
cat fclc++.cc
#include <iostream
Tu as oublié l'« #include
définis.
Yep. Je ne prend jamais la « peine » de l'inclure dans des petits
tests rapides, et bien sûr, ne pense pas à l'ajouter si je poste le
code .
|
C'est seulement pour dire que le fait qu'il compile n'en prouve pas la
légalité.
| Quote: | class B
{
public:
B( class A* pA ) : m_pA( pA ) { }
class A* m_pA ;
} ;
class A
{
public:
A() : m_B( this ) { }
const B m_B ;
} ;
Ajoutons un:
class C : public A
{
public:
C() : unDeuxiemeB( this ) {}
B const unDeuxiemeB ;
} ;
G++ ne dit toujours rien. Et pourtant, c'est illégal. La conversion
de this (un C*) en A* a un comportement indéfini.
Yep.
En fait, il y a de fortes chances que ça marche, tant qu'il n'y a
pas d'héritage virtuel. Mais la norme l'interdit explicitement.
Je ne vois pas exactement comment l'héritage virtuel complique
l'affaire. Lors d'une conversion entre deux types d'une même
hiérarchie avec héritage virtuel, il est possible que le compilateur
doive ajouter ou retrancher un petit décalage à la valeur du pointeur.
Et si je comprend bien, la valeur de ce décalage est connue dès que
les types sont connus (ce qui est le cas dans une conversion).
|
Le problème avec l'héritage virtuel, c'est que ce décalage dépend du
type le plus dérivé, à construire. On ne peut pas le savoir d'avance. Ce
n'est pas une constante de compilation pour la classe C, parce que si je
dérive un D de C, le décalage dans le C dans le D serait différent du
décalage du C tout seul.
En ce qui concerne le this, il faut que le compilateur ait
l'information, parce que dans le corps proprement dit du constructeur
(c-à-d sans la liste d'initialisation), il faut pouvoir appeler des
fonctions de la classe de base. Mais le constructeur de C n'est pas
obligé à mettre cette information à un endroit où d'autres peuvent y
accéder avant d'arriver dans son corps proprement dit. Convertir un
pointeur autre que this, ailleurs, pourrait ne pas fonctionner
correctement. Et la régle parle des pointeurs à l'objet, et non
spécifiquement de this. (En fait, si ça marche dépend de la façon que le
compilateur gère des classes de base virtuelles.)
| Quote: | Si l'on a l'adresse d'un objet, on peux calculer celle d'un
sous-objet ou sur-objet, indépendamment que ces objets soient ou non
construits (les adresses sont donc plutôt celles d'endroits où se
*trouveraient* les objets).
|
Pas dans le cas des bases virtuelles. Il te faut une information
dynamique, que tu trouves soit dans le vtable (et donc, à travers le
vptr), soit dans la classe même. Or, c'est le constructeur qui
initialise le vptr ou les autres informations dans la classe.
--
James Kanze GABI Software mailto:kanze (AT) gabi-soft (DOT) fr
Conseils en informatique orientée objet/ http://www.gabi-soft.fr
Beratung in objektorientierter Datenverarbeitung
11 rue de Rambouillet, 78460 Chevreuse, France, +33 (0)1 30 23 45 16
|
|
| Back to top |
|
 |
drkm Guest
|
Posted: Thu Jul 10, 2003 1:55 pm Post subject: Re: 'this' : used in base member initializer list |
|
|
[email]kanze (AT) gabi-soft (DOT) fr[/email] wrote in message
news:<d6652001.0307100100.48cca154 (AT) posting (DOT) google.com>...
| Quote: | C'est seulement pour dire que le fait qu'il compile n'en prouve pas
la légalité.
|
Yep, comme toujours. Ceci n'était qu'un complément à un autre
article posté parallèlement (et un peu trop vite).
| Quote: | Je ne vois pas exactement comment l'héritage virtuel complique
l'affaire.
Le problème avec l'héritage virtuel, c'est que ce décalage dépend du
type le plus dérivé, à construire.
|
Ok. Je n'avais pas pensé à ce fait. Je pensais (un peu vite) que
le décalage était tout le temps le même pour deux mêmes types,
indépendamment du fait qu'ils soient des sous-objets de différents
types.
Je comprend mieux, maintenant.
--drkm
|
|
| Back to top |
|
 |
drkm Guest
|
Posted: Thu Jul 10, 2003 3:02 pm Post subject: Re: 'this' : used in base member initializer list |
|
|
[email]kanze (AT) gabi-soft (DOT) fr[/email] wrote in message
news:<d6652001.0307100041.452422b2 (AT) posting (DOT) google.com>...
| Quote: | drkm <darkman_spam (AT) yahoo (DOT) fr> wrote in message
news:<wkn0fnomqn.fsf (AT) yahoo (DOT) fr>...
[email]kanze (AT) gabi-soft (DOT) fr[/email] writes:
drkm <darkman_spam (AT) yahoo (DOT) fr> wrote in message
news:<wkr850u2ip.fsf (AT) yahoo (DOT) fr>...
Je n'ai cependant pas réussi à trouver un passage clair sur
l'appartenance ou non du `ctor-initializer´ au corps de son
constructeur. S'il devait s'avérer qu'il n'y appartient pas,
il ne serait alors pas possible d'y utiliser `this´, non ?
Ce qui suggèrerait que l'utilisation de this dans la liste
d'initialisation serait illégale.
Oui. Si le `ctor-initializer´ ne fait pas partie du corps du
constructeur.
Ce que je crains, c'est que c'est parfois oui, parfois non, selon
l'auteur exact du passage.
|
Ce qui est embêtant.
| Quote: | Tous les compilateurs le permettent, et je suis assez sûr que
c'était l'intention du comité de le permettra.
C'est ce que j'imagine. Mais ce ne serait pas, je pense, le
premier exemple de contradiction entre l'intention du comité et sa
rédaction dans la norme ...
Certes. C'est ce qui arrive quand on veut faire trop, trop vite.
|
Ce dont le JTC1/SC22/WG21 n'a pas le monopole .
| Quote: | D'autant que je ne vois pas de raison pour un compilateur de
connaître la valeur de `this´ dans le corps du constructeur (je
veux dire après l'accolade ouvrante) et non dans la liste
d'initialistion.
S'il ne connaît pas this dans la liste d'initialisation, comment
fait-il à passer le this aux constructeurs des sous-objets ?
|
Je vois même maintenant une raison pour qu'il la connaisse dans la
liste d'initialisation .
| Quote: | Dans ce cas-ci, l'idiome est assez courant. Assez pour que je
crois Microsoft a eu tort d'émettre un avertissment, même si ça
part d'un bon sentiment.
Du moins, de l'émettre sans options particulières. Je le
verrais bien dans un mode « full warnings ». Un peu comme
`-Weffc++´ peut avec GCC nous submerger d'avertissements inutiles,
ou en émettre de très pertinents.
Je ne sais pas. Dans la doute, je crois que mettre un maximum
d'avertissements par défaut, ce n'est peut-être pas une mauvaise
politique. Après tout, le programmeur qui sait ce qu'il fait sait
qu'il faut lire la documentation, et spécifier exactement des
avertissements dont il a besoin.
|
Comme tu le dis, « le programmeur qui sait ce qu'il fait sait qu'il
faut lire la documentation, et spécifier exactement des avertissements
dont il a besoin ». De l'autre côté, celui du programmeur qui ne sait
pas ce qu'il fait (je pense surtout aux débutants), les diagnostiques
sont souvent du chinois pour le néophyte et j'ai vu beaucoup d'élèves,
face à d'innombrables avertissements, hausser les bras : « Ce ne sont
que des warnings ». Peut-être que s'ils n'en recevaient que
quelques-uns seraient-ils plus enclins à s'y attarder.
Mais évidemment, si on a un programmeur qui ne sait pas ce qu'il
fait, avertissements ou pas, on va directement dans le mur.
| Quote: | Mais j'aimerais savoir ce qu'il en est pour l'appartenance du
`ctor-initializer´ au corps du constructeur. Quelqu'un a-t-il une
piste ?
Il faudra peut-être démander dans comp.std.c++.
|
Ok. Mon serveur de news a pour l'instant de gros problèmes. Je
viens de leur téléphoner, ils « sont au courant et s'occupent de tout,
au plus vite » ... Je poste dès que possible.
--drkm
|
|
| Back to top |
|
 |
James Kanze Guest
|
Posted: Sun Jul 13, 2003 3:21 pm Post subject: Re: 'this' : used in base member initializer list |
|
|
Gabriel Dos Reis <gdr (AT) integrable-solutions (DOT) net> writes:
| Quote: | kanze (AT) gabi-soft (DOT) fr writes:
| > Je n'ai cependant pas réussi à trouver un passage
| > clair sur l'appartenance ou non du `ctor-initializer´ au
| > corps de son constructeur. S'il devait s'avérer qu'il n'y
| > appartient pas, il ne serait alors pas possible d'y utiliser
| > `this´, non ?
| Ce qui suggèrerait que l'utilisation de this dans la liste
| d'initialisation serait illégale. Tous les compilateurs le
| permettent, et je suis assez sûr que c'était l'intention
| du comité de le permettra.
L'utilisation de « this » dans le ctor-initializer est
tout ce qu'il y a de plus valide. Voir 3.8/5 -- que je n'ai pas
le temps de citer, mais ce n'est pas un problème puisque nombre
d'intervenants dans ce thread semblent disposer d'un exemplaire de
la norme.
|
Mais ce n'était pas là le problème. On sait qu'il peut
exister des pointeurs à l'objet avant que l'objet soit construit,
et qu'il y a des limitations à ce qu'on peut faire avec de tels
pointeurs.
Mais la réponse voulue se trouve bien dans 5.1/3, qui dit
explicitement que this peut servir dans la liste d'initialisation d'un
constructeur. (J'aurais dû régarder avant de répondre -- le
texte cité avant dans le thread parlait uniquement de l'utilisation
de this dans le corps d'une fonction, ce qui aurait exclu les listes
d'initialisation.)
--
James Kanze mailto:kanze (AT) gabi-soft (DOT) fr
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
11 rue de Rambouillet, 78460 Chevreuse, France +33 1 41 89 80 93
|
|
| Back to top |
|
 |
James Kanze Guest
|
Posted: Sun Jul 13, 2003 7:21 pm Post subject: Re: 'this' : used in base member initializer list |
|
|
Gabriel Dos Reis <gdr (AT) integrable-solutions (DOT) net> writes:
| Quote: | James Kanze <kanze (AT) alex (DOT) gabi-soft.fr> writes:
| Gabriel Dos Reis <gdr (AT) integrable-solutions (DOT) net> writes:
| |> L'utilisation de « this » dans le ctor-initializer
| |> est tout ce qu'il y a de plus valide. Voir 3.8/5 -- que je
| |> n'ai pas le temps de citer, mais ce n'est pas un problème
| |> puisque nombre d'intervenants dans ce thread semblent
| |> disposer d'un exemplaire de la norme.
| Mais ce n'était pas là le problème.
Ah bon ?
| On sait qu'il peut exister des pointeurs à l'objet avant que
| l'objet soit construit, et qu'il y a des limitations à ce
| qu'on peut faire avec de tels pointeurs.
Le point que tu n'as pas saisi est qu'il peut être utilisé
dans la liste d'initialisation. Ce qui répond à la question
posée.
|
Manifestement, tu n'as pas suivi le fil depuis son début.
--
James Kanze mailto:kanze (AT) gabi-soft (DOT) fr
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
11 rue de Rambouillet, 78460 Chevreuse, France +33 1 41 89 80 93
|
|
| Back to top |
|
 |
drkm Guest
|
Posted: Sun Jul 13, 2003 10:11 pm Post subject: Re: 'this' : used in base member initializer list |
|
|
Gabriel Dos Reis <gdr (AT) integrable-solutions (DOT) net> writes:
| Quote: | James Kanze <kanze (AT) alex (DOT) gabi-soft.fr> writes:
| Mais ce n'était pas là le problème.
Ah bon ?
|
Ah bon ?
| Quote: | | On sait qu'il peut exister des pointeurs à l'objet avant que
| l'objet soit construit, et qu'il y a des limitations à ce qu'on
| peut faire avec de tels pointeurs.
Le point que tu n'as pas saisi est qu'il peut être utilisé dans la
liste d'initialisation.
|
Et cela est dit dans 3.8/5 ?
| Quote: | Ce qui répond à la question posée.
|
Ce qui réponderait à la question posée.
--drkm
|
|
| Back to top |
|
 |
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
|