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
drkm
Gabriel Dos Reis writes:

drkm writes:

| 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´.

Si te demander de réfléchir à ce qu'est 'this' est une manière floue
et cryptique, alors soit.


Me demander de réfléchir à ce qu'est `this´ est une manière floue et
cryptique de me montrer où 3.8/5 dit qu'il peut être utilisé dans la
liste d'initialisation.

Je ne dis pas que ce n'est pas la bonne manière, mais je n'arrive
pas à l'emprunter pour arriver au résultat escompté. Pourrais-tu
alors être plus explicite, s'il te plaît, et démontrer plus
explicitement ton affirmation ?

| 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.

non seulement il veut mais il a cité le paragraphe en question.

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

il n'en est nul besoin.

[...]

| 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.

Je ne te demande pas de me croire -- sinon je m'y serais pris
autrement. Juste de réfléchir, mais tu sembles dire que c'est flou
et cryptique de refléchir ; dans ce cas je ne peux rien pour toi
;-/.


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.

--drkm

Avatar
Gabriel Dos Reis
drkm writes:


[...]

| > | 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.
|
| Yep. Je le copie ici :
|
| 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.
|
| Ces deux points (dé)montrent que l'emploit de `this´ est soumis aux
| règles de 3.8/5.

ce paragraphe montre

que *toute expression* qui désigne l'emplacement de l'objet est
utilisation dans la liste d'initialisation

'this' est une telle expression -- d'où ma question, qu'est-ce que 'this'.
Donc, 'this' est utilisable dans cette liste.

| Je suis d'accord. Mais je t'assure que s'ils
| montrent également que c'est 3.8/5 qui permet l'emploit de `this´ dans
| la liste d'initialisation, je ne le vois pas.

tant pis.

-- Gaby
Avatar
drkm
Gabriel Dos Reis writes:

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.


Yep. Je le copie ici :

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.

Ces deux points (dé)montrent que l'emploit de `this´ est soumis aux
règles de 3.8/5. Je suis d'accord. Mais je t'assure que s'ils
montrent également que c'est 3.8/5 qui permet l'emploit de `this´ dans
la liste d'initialisation, je ne le vois pas.

--drkm

Avatar
drkm
Gabriel Dos Reis writes:

drkm writes:

| 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.


Et le passage où elle désigne cet endroit comme permis n'est pas
3.8/5 -- du moins je ne le vois pas.

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.


Yep.

--drkm

Avatar
Gabriel Dos Reis
drkm writes:

| Gabriel Dos Reis writes:
|
| > drkm writes:
|
| > | 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.
|
| Et le passage où elle désigne cet endroit comme permis n'est pas
| 3.8/5 -- du moins je ne le vois pas.

C'etait aussi expliqué dans le message que tu avais cité.
Mais je ne peux pas t'obliger à voir (ce que tu ne veux pas voir).

-- Gaby
Avatar
Gabriel Dos Reis
drkm writes:

| Gabriel Dos Reis writes:
|
| > drkm writes:
|
| [...]
|
| > | Ces deux points (dé)montrent que l'emploit de `this´ est soumis
| > | aux règles de 3.8/5.
|
| > ce paragraphe montre
|
| > que *toute expression* qui désigne l'emplacement de l'objet est
| > utilisation dans la liste d'initialisation
|
| Ce paragraphe montre
|
| *comment* certains pointeurs particuliers peuvent être utilisés.

pas uniquement ça.

-- Gaby
Avatar
James Kanze
"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.
|> Pourquoi veux-tu que "this" soit nécessairement cité, plus
|> que myPtr ou un autre ?

La question concernait la portée du mot clé this. Le paragraphe
en question ne traite en rien la question des portées. Je ne vois
donc pas sa rélévance à la question.

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

Mais il ne dit rien sur la visibilité de tel ou tel nom.

|> 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...)

On ne dit pas que le passage en question DOIT parler de la portée
de this. On dit simplement qu'il ne répond pas à la question
posée. (Il répond bien à d'autres questions, évidemment.)

--
James Kanze mailto:
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
11 rue de Rambouillet, 78460 Chevreuse, France +33 1 41 89 80 93
Avatar
Gabriel Dos Reis
James Kanze writes:

| "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.
| |> Pourquoi veux-tu que "this" soit nécessairement cité, plus
| |> que myPtr ou un autre ?
|
| La question concernait la portée du mot clé this.

'this' est un mot clé du langage. La question de portée est donc sans objet.

| |> Le paragraphe précise les critères d'usage d'un pointeur,
| |> quelque soit son nom et son rôle par ailleurs.
|
| Mais il ne dit rien sur la visibilité de tel ou tel nom.

c'est un mot clé, donc à ce titre ne peut être sujet de déclaration.
En conséquence la notion de visibilité est sans objet.

| |> 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...)
|
| On ne dit pas que le passage en question DOIT parler de la portée
| de this.

Renseigne-toi d'abord sur la notion de portée avant de vouloir
l'appliquer à 'this'.

-- Gaby
Avatar
Gabriel Dos Reis
James Kanze writes:

| Le passage en question parle des utilisations possibles. Il ne
| s'adresse aucunement à la question initialement posée, qui
| concernait la portée de this.

'this' est un mot clé, donc ne peut être sujet de déclaration ; en
conséquence « la portée de this » est une contradiction dans les termes.

-- Gaby
Avatar
James Kanze
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.

Ce n'est pas this qui remplit les critères, mais une utilisation
éventuelle. On pourrait aussi concevoir des utilisations qui ne les
remplissent pas (conversion en pointeur à une classe de base, par
exemple).

Le passage en question parle des utilisations possibles. Il ne
s'adresse aucunement à la question initialement posée, qui
concernait la portée de this.

--
James Kanze mailto:
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
11 rue de Rambouillet, 78460 Chevreuse, France +33 1 41 89 80 93