3
Est-ce conforme à la norme?Est-ce C++ standard d'assigner un pointeur de membre à l'adresse d'un autre membre dans l'initialiseur de constructeur?
class Foo {
Bar m_bar;
Bar * m_woo;
public:
Foo() : m_bar(42, 123), m_woo(&m_bar) { }
};
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. –
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'. –
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. –