OVH Cloud OVH Cloud

'this' : used in base member initializer list

80 réponses
Avatar
amerio
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

10 réponses

Avatar
Gabriel Dos Reis
drkm writes:

| Gabriel Dos Reis writes:
|
| > drkm writes:
|
| > | > | Du moins je ne vois pas où, et j'aimerais qu'on m'explique où
| > | > | cela est dit dans 3.8/5.
|
| > | > Pour voir où, pose-toi la question « qu'est-ce que 'this' ? ».
|
| > | Mes réflexions ne sauraient être que des extrapolations s'il
| > | s'agit de faire dire à 3.8/5 que `this´ est utilisable dans la
| > | liste d'initialisation.
|
| > Je te demande simplement de réflechir à la question « qu'est-ce que
| > 'this' ? ». Rien de plus.
|
| Je te demande simplement de répondre à la question « où vois-tu dans
| 3.8/5 que `this´ est utilisable dans la liste d'initialisation ? ».
| Rien de plus.

et je t'ai donné la clé de la réponse à ta question. Tu veux plus ?

-- Gaby
Avatar
drkm
Gabriel Dos Reis writes:

drkm writes:

| Gabriel Dos Reis writes:

| > "Alain Naigeon" writes:

| > | "drkm" a écrit dans le message news:
| > |

| > | > Gabriel Dos Reis writes:
| > | > > La phrase clé est

| > | > > Before the lifetime of an object started but after the
| > | > > storage which the object has been allocated or, after
| > | > > the lifetime or an object has ended and before the
| > | > > storage which the object occupied is reused or released,
| > | > > any pointer that refers to the storage location where
| > | > > the object will be or was located *may be used* but only
| > | > > in limited ways. [...]

| > | > > 1) "this" désigne où va se trouver l'objet ;
| > | > > 2) le constructeur est appelé après allocation de mémoire
| > | > > et la durée de vie d'un objet n'a pas commencé avant
| > | > > que le constructeur ait fini de s'éxécuter.

| > | > Non, je demandais où tu voyais, dans 3.8/5, que `this´ est
| > | > utilisable dans la liste d'initialisation.

| > | Ce que je comprends ici, c'est que this semble remplir les
| > | critères du paragraphe cité - donc son usage est autorisé

| > Exactement.

| Oui.

Il faudrait savoir. Tu es d'accord ou pas d'accord ?


Pardon, je n'ai pas été assez clair. Je suis bien sûr d'accord avec
le fait que `this´ puisse « remplir les critères du paragraphe cité »
à certains moments. Mais je ne suis pas d'accord avec le fait que
cela implique que l'on puisse l'utiliser dans la liste
d'initialisation.

Ce qu'explicitait la remarque qui suivait :

| Dans les endroits où `this´ est légal, il doit se conformer à
| ce passage s'il s'avère que l'objet pointé n'a pas encore été
| construit, ou a déjà été détruit. Mais la question reste posée,
| où vois-tu, dans 3.8/5, que `this´ est utilisable dans la liste
| d'initialisation ?

| Tu ne m'as toujours pas répondu.

Rectification : tu as ignoré les réponses.


Tu ne m'as toujours pas répondu. Où vois-tu, dans 3.8/5, que `this´
est utilisable dans la liste d'initialisation ?

--drkm

Avatar
drkm
Gabriel Dos Reis writes:

drkm writes:

| Gabriel Dos Reis writes:

| > drkm writes:

| > | Gabriel Dos Reis writes:

| > | > "Alain Naigeon" writes:

| > | > | "drkm" a écrit dans le message
| > | > | news:

| > | > | > Gabriel Dos Reis writes:
| > | > | > > La phrase clé est

| > | > | > > Before the lifetime of an object started but after
| > | > | > > the storage which the object has been allocated or,
| > | > | > > after the lifetime or an object has ended and before
| > | > | > > the storage which the object occupied is reused or
| > | > | > > released, any pointer that refers to the storage
| > | > | > > location where the object will be or was located
| > | > | > > *may be used* but only in limited ways. [...]

| > | > | > > 1) "this" désigne où va se trouver l'objet ;
| > | > | > > 2) le constructeur est appelé après allocation de
| > | > | > > mémoire et la durée de vie d'un objet n'a pas
| > | > | > > commencé avant que le constructeur ait fini de
| > | > | > > s'éxécuter.

[...]

| > | Tu ne m'as toujours pas répondu.

| > Rectification : tu as ignoré les réponses.

| Tu ne m'as toujours pas répondu.

si. D'ailleurs c'est la réponse à cette question qui a donné lieu à
ce sous-thread. Ou, tu veux un goto explicite ? ;-/


Je ne te demande que cela. Un goto explicite dans 3.8/5. Tu
affirmes que ce passage permet l'utilisation de `this´ dans le
`ctor-initializer´, j'aimerais que tu me montres où exactment.

Comme j'ai dit, il suffit de s'interroger sur ce qu'est this.


Ce n'est de toute évidence pas suffisant pour moi. Alors, s'il te
plaît, montre-moi clairement où 3.8/5 dit que `this´ peut être utilisé
dans la liste d'initialisation.

--drkm

Avatar
drkm
Gabriel Dos Reis writes:

Tu veux plus ?


Oui.

--drkm

Avatar
Gabriel Dos Reis
drkm writes:

| Gabriel Dos Reis writes:
|
| > drkm writes:
|
| > | Gabriel Dos Reis writes:
|
| > | > drkm writes:
|
| > | > | Gabriel Dos Reis writes:
|
| > | > | > "Alain Naigeon" writes:
|
| > | > | > | "drkm" a écrit dans le message
| > | > | > | news:
|
| > | > | > | > Gabriel Dos Reis writes:
| > | > | > | > > La phrase clé est
|
| > | > | > | > > Before the lifetime of an object started but after
| > | > | > | > > the storage which the object has been allocated or,
| > | > | > | > > after the lifetime or an object has ended and before
| > | > | > | > > the storage which the object occupied is reused or
| > | > | > | > > released, any pointer that refers to the storage
| > | > | > | > > location where the object will be or was located
| > | > | > | > > *may be used* but only in limited ways. [...]
|
| > | > | > | > > 1) "this" désigne où va se trouver l'objet ;
| > | > | > | > > 2) le constructeur est appelé après allocation de
| > | > | > | > > mémoire et la durée de vie d'un objet n'a pas
| > | > | > | > > commencé avant que le constructeur ait fini de
| > | > | > | > > s'éxécuter.
|
| > [...]
|
| > | > | Tu ne m'as toujours pas répondu.
|
| > | > Rectification : tu as ignoré les réponses.
|
| > | Tu ne m'as toujours pas répondu.
|
| > si. D'ailleurs c'est la réponse à cette question qui a donné lieu à
| > ce sous-thread. Ou, tu veux un goto explicite ? ;-/
|
| Je ne te demande que cela. Un goto explicite dans 3.8/5.

voir ce qu'il au-dessus.

[...]

| > Comme j'ai dit, il suffit de s'interroger sur ce qu'est this.
|
| Ce n'est de toute évidence pas suffisant pour moi. Alors, s'il te
| plaît, montre-moi clairement où 3.8/5 dit que `this´ peut être utilisé
| dans la liste d'initialisation.

Voir ci-dessus. Exprès j'ai laissé le machin imbriqué je ne sais
combien de fois.

-- Gaby
Avatar
Alain Naigeon
"drkm" a écrit dans le message news:

Gabriel Dos Reis writes:

Tu veux plus ?


Oui.


Apparemment il n'y a pas plus dans le paragraphe en question.
Pourquoi veux-tu que "this" soit nécessairement cité, plus que
myPtr ou un autre ? Le paragraphe précise les critères d'usage
d'un pointeur, quelque soit son nom et son rôle par ailleurs.
Evidemment si this avait été un cas particulier où l'usage n'était
*pas* permis, cette exception aurait due être signalée ici. En
revanche, dans un document de norme (et non de pédagogie),
on peut concevoir que, pour des raisons de place, on ne réponde
pas systématiquement à tous les doutes d'un usager (ceci dit, je
ne te fais pas la leçon, je suis certainement moins expérimenté que toi
à ce que j'ai pu constater ! - mais il me semble que dans ce cas précis
tu vis une espèce de blocage vis à vis de cette question...)

--

Français *==> "Musique renaissance" <==* English
midi - facsimiles - ligatures - mensuration
http://anaigeon.free.fr | http://www.medieval.org/emfaq/anaigeon/
Alain Naigeon - - Strasbourg, France


Avatar
Alain Naigeon
"drkm" a écrit dans le message news:


Pardon, je n'ai pas été assez clair. Je suis bien sûr d'accord avec
le fait que `this´ puisse « remplir les critères du paragraphe cité »
à certains moments.


Si tu relis le paragraphe, ou son exégèse par Gaby, tu vois aussi
que les *circonstances* de son usage s'appliquent elles aussi à
la liste d'initialisation du constructeur, d'où il découle que :

cela implique que l'on puisse l'utiliser dans la liste
d'initialisation.


--

Français *==> "Musique renaissance" <==* English
midi - facsimiles - ligatures - mensuration
http://anaigeon.free.fr | http://www.medieval.org/emfaq/anaigeon/
Alain Naigeon - - Strasbourg, France

Avatar
drkm
"Alain Naigeon" writes:

"drkm" a écrit dans le message news:


Gabriel Dos Reis writes:

Tu veux plus ?


Oui.


Apparemment il n'y a pas plus dans le paragraphe en question.


C'est mon avis (en ce qui concerne le point qui nous occupe).

Pourquoi veux-tu que "this" soit nécessairement cité, plus que
myPtr ou un autre ?


Je ne veux rien. Juste une explication de la part de Gaby au sujet
d'une affirmation qu'il a faite [1], que je ne comprends pas, et qu'il
s'entête à vouloir m'expliquer de la même manière floue et cryptique,
en me demandant de réfléchir à ce qu'est `this´. Il ne [v|p]eut
bizarrement pas citer de passage précis de 3.8/5 qui dit que `this´
peut être utilisé dans `mem-initializer´. Moi non plus.

Entre parenthèses, `this´ n'est pas cité, mais désigné de manière
flagrante.

Le paragraphe précise les critères d'usage d'un pointeur, quelque
soit son nom et son rôle par ailleurs.


Yep (critères d'usage de pointeurs particuliers, vers des objets
alloués mais non encore construits ou déjà détruits).

Evidemment si this avait été un cas particulier où l'usage n'était
*pas* permis, cette exception aurait due être signalée ici.


Ici ou ailleurs.

En revanche, dans un document de norme (et non de pédagogie), on
peut concevoir que, pour des raisons de place, on ne réponde pas
systématiquement à tous les doutes d'un usager (ceci dit, je ne te
fais pas la leçon, je suis certainement moins expérimenté que toi à
ce que j'ai pu constater !


Je suis débutant dans cet exercice difficile (la lecture de la
norme). Je ne demandes qu'à croire Gaby. Si ce qu'il dit est vrai,
j'aimerais le voir.

Malheureusement, il semble vouloir me le faire découvrir par
moi-même, en me demandant de réfléchir à la question « qu'est-ce que
`this´ ? ». Je lui ai répondu que cela ne suffisait pas pour moi, que
je ne comprenais pas, et il s'entête à ne pas me donner de passage
précis expliquant son affirmation.

- mais il me semble que dans ce cas précis tu vis une espèce de
blocage vis à vis de cette question...)


Non. Justement. J'aimerais comprendre où Gaby voit dans 3.8/5 que
`this´ est utilisable dans la liste d'initialisation.

[1] Message-ID:

--drkm



Avatar
Gabriel Dos Reis
drkm writes:

| Je pense qu'une petite mise au point plus concrète est nécessaire.
| Admettons que la norme permette l'emploit de `this´ dans une fonction
| membre statique, par exemple en spécifiant qu'il désigne de manière
| (pseudo-)aléatoire un objet de cette classe, éventuellement alloué
| mais non construit. 3.8/5 s'appliquerait alors également à cet usage
| de `this´.
|
| Mais cet usage est interdit.


Huh ?!?.

| Cela n'est pas dit dans 3.8/5, mais
| autre part dans la norme. De la même manière, ce n'est pas dans 3.8/5
| qu'il est dit que `this´ peut être utilisé dans la liste
| d'initialisation, même s'il désigne cet emploit, entre autres.

ce que tu sembles ne pas vouloir admettre, c'est que la norme énonce
des règles générales qui s'appliquent dans des situations spécifiques
sauf mention explicite du contraire : si elle désigne cet endroit
comme permis alors c'est permis. C'est la différence entre énoncer une
règle qui contien 44 points et une règle générale qui les couvre toutes.

| À ce sujet, je viens de dire en début d'article que je ne voyais pas
| où d'autre que dans un ctor ou dtor ce passage pouvait s'appliquer à
| `this´. Il me semble qu'il s'appliquerait également au bout de code
| suivant :
|
| UneClasse * UneClasse::UnMembreNonStatique()
| {
| this->~UneClasse() ;
| return this ;
| }
|
| Est-ce correct ?

Oui.

3.8/5 contient d'autres exemples.

-- Gaby
Avatar
Gabriel Dos Reis
drkm writes:


[...]

| Je ne dis pas qu'il est flou et cryptique de réfléchir (que dis-tu
| déjà, à propos du contexte d'une citation ?). Mais je n'arrive pas à
| voir comment réfléchir à ce qu'est `this´ me montrera où 3.8/5 permet
| l'emploit de `this´ dans la liste d'initialisation.
|
| > | Malheureusement, il semble vouloir me le faire découvrir par
| > | moi-même, en me demandant de réfléchir à la question « qu'est-ce
| > | que `this´ ? ». Je lui ai répondu que cela ne suffisait pas pour
| > | moi, que je ne comprenais pas, et il s'entête à ne pas me donner
| > | de passage précis expliquant son affirmation.
|
| > | > - mais il me semble que dans ce cas précis tu vis une espèce de
| > | > blocage vis à vis de cette question...)
|
| > | Non. Justement. J'aimerais comprendre où Gaby voit dans 3.8/5
| > | que `this´ est utilisable dans la liste d'initialisation.
|
| > Gaby te l'a expliqué à maintes reprises. Je ne peux pas te forcer a
| > comprendre.
|
| Malheureusement :-). Mais tu peux sans doute être plus explicite.
| Le passage que tu m'as cité est :
|
| From: Gabriel Dos Reis
| Subject: Re: 'this' : used in base member initializer list
| Date: 14 Jul 2003 00:37:17 +0200
| Message-ID:
|
| | > | Et cela est dit dans 3.8/5 ?
|
| | > oui.
| |
| | Pourrais-tu citer le passage précis, s'il te plaît ? Je
| | n'arrive pas à voir où il est dit, dans 3.8/5, que `this´ peut
| | être utilisé dans la liste d'initialisation.
|
| La phrase clé est
|
| Before the lifetime of an object started but after the storage
| which the object has been allocated or, after the lifetime or an
| object has ended and before the storage which the object
| occupied is reused or released, any pointer that refers to the
| storage location where the object will be or was located *may be
| used* but only in limited ways. [...]
|
| Je ne vois toujours pas comment ce passage permet l'utilisation de
| `this´ dans la liste d'initialisation.

Tu parlais de contexte plus haut, tu as oublié le reste du message que
tu citais.

-- Gaby