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

1 2 3 4 5
Avatar
drkm
"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é
(implicitement).


Si `this´ est utilisable dans la liste d'initialisation, et cela est
dit explicitement dans 5.1/3 [1], son utilisation doit alors se
conformer à 3.8/5. Mais il n'est pas dit dans ce passage que `this´
peut être utilisé dans `ctor-initializer´. Du moins je ne vois pas
où, et j'aimerais qu'on m'explique où cela est dit dans 3.8/5.

En outre, la question de l'utilisation de `this´ dans la liste
d'initialisation étant réglée, celle de l'appartenance de
`ctor-initializer´ au corps du constructeur reste ouverte, bien
qu'étant pour l'instant sans objet, et sans doute inutile.

[1] The keyword `this´ should be used only inside a nonstatic
class member function body (9.3) or in a constructor
`mem-initializer´ (12.6.2).

--drkm



Avatar
Gabriel Dos Reis
"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.

-- Gaby
Avatar
Gabriel Dos Reis
drkm writes:

| Gabriel Dos Reis writes:
|
| > drkm writes:
|
| > | Non, je demandais où tu voyais, dans 3.8/5, que `this´ est
| > | utilisable dans la liste d'initialisation.
|
| > C'est ce que je viens de te montrer.
|
| Non.

Tant pis pour toi.

-- Gaby
Avatar
Gabriel Dos Reis
drkm 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é
| > (implicitement).
|
| Si `this´ est utilisable dans la liste d'initialisation, et cela est
| dit explicitement dans 5.1/3 [1], son utilisation doit alors se
| conformer à 3.8/5.

Ce qui est bien le cas. Pour voir pourquoi, essaye de répondre à la
question « quelle fonction est susceptible de tolérer l'utilisation de
"this" » dans son body.  La paragraphe que tu cites est écrit pour
exclure essentiellement les fonctions membres statiques et les
fonctions non-membres.

| Mais il n'est pas dit dans ce passage que `this´
| peut être utilisé dans `ctor-initializer´.

Il est dit dans ce passage que tout pointeur qui désigne(ra)
l'emplacement de l'objet est utilisable.  « this » en est un.
CQFD.

| 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' ? ».

| En outre, la question de l'utilisation de `this´ dans la liste
| d'initialisation étant réglée, celle de l'appartenance de
| `ctor-initializer´ au corps du constructeur reste ouverte, bien
| qu'étant pour l'instant sans objet, et sans doute inutile.

dans ce cas, c'est sans doute inutile d'y répondre.

-- Gaby
Avatar
drkm
Gabriel Dos Reis writes:

drkm writes:

| Gabriel Dos Reis writes:

| > drkm writes:

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

| > C'est ce que je viens de te montrer.

| Non.

Tant pis pour toi.


Yep.

--drkm

Avatar
Gabriel Dos Reis
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 ?

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

-- Gaby
Avatar
drkm
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. 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.

--drkm

Avatar
Gabriel Dos Reis
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.

-- Gaby
Avatar
drkm
Gabriel Dos Reis writes:

drkm 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é
| > (implicitement).

| Si `this´ est utilisable dans la liste d'initialisation, et cela
| est dit explicitement dans 5.1/3 [1], son utilisation doit alors
| se conformer à 3.8/5.

Ce qui est bien le cas. Pour voir pourquoi, essaye de répondre à la
question « quelle fonction est susceptible de tolérer l'utilisation
de "this" » dans son body.


Mais je ne vois toujours pas où 3.8/5 dit que `this´ peut être
employé dans la liste d'initialisation. J'attends toujours.

La paragraphe que tu cites est écrit pour exclure essentiellement
les fonctions membres statiques et les fonctions non-membres.


Et inclure explicitement la liste d'initialisation. En fait, pour
désigner, *explicitement*, et uniquement, le corps des fonctions
membres non statiques et les `mem-initializer´.

| Mais il n'est pas dit dans ce passage que `this´
| peut être utilisé dans `ctor-initializer´.

Il est dit dans ce passage que tout pointeur qui désigne(ra)
l'emplacement de l'objet est utilisable.  « this » en est un.


Quand il remplit ses conditions d'utilisation.

CQFD.


Yep, modulo la condition supplémentaire ci-dessus, ce qu'affirme
5.1/3. Je ne vois pas où 3.8/5 le dit. S'il te plaît, montre-le moi.

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

| En outre, la question de l'utilisation de `this´ dans la liste
| d'initialisation étant réglée, celle de l'appartenance de
| `ctor-initializer´ au corps du constructeur reste ouverte, bien
| qu'étant pour l'instant sans objet, et sans doute inutile.

dans ce cas, c'est sans doute inutile d'y répondre.


Yep.

--drkm

Avatar
Gabriel Dos Reis
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 ? ;-/
Comme j'ai dit, il suffit de s'interroger sur ce qu'est this.

-- Gaby
1 2 3 4 5