2010-05-04 13 views

Répondre

4

C'est correct. Ce qui est incorrect, c'est de déréférencer ce pointeur avant que ce sous-objet particulier ait été entièrement initialisé.

+2

Et les sous-objets sont initialisés dans l'ordre dans lequel ils sont déclarés, et non dans l'ordre dans lequel ils apparaissent dans la liste d'initialisation. Donc, même si le constructeur était écrit comme 'Foo(): m_woo (& m_bar), m_bar (42, 123) {}', 'm_bar' serait construit avant que' m_woo' ne soit. –

+0

Droit @Dennis, mais même si l'ordre était le contraire, avec l'exemple donné, il serait toujours correct, car vous pouvez initialiser un pointeur ou une référence au membre encore non initialisé. Le problème serait que si dans la liste d'initialisation, 'm_woo' était déréférencé avant l'initialisation de' m_bar'. –

+0

Non, je comprends. Je clarifiais au cas où il aurait besoin de déréférencer 'm_woo' pour un autre membre. Mon intuition dit que l'initialisation a lieu dans l'ordre donné par la liste d'initialisation, et cette intuition est fausse. –