Je suis curieux quant au comportement des éléments suivants:Appel fonction virtuelle du constructeur membre
#include <iostream>
#include <string>
struct A;
struct B {
std::string b;
B(A& a);
};
struct A {
B member;
virtual std::string f() { return "Hello, World!"; }
A() : member(*this) {}
};
B::B(A& a) : b(a.f()) {}
int main() {
std::cout << A().member.b;
}
Est-ce nécessaire d'imprimer le résultat attendu? Ou est-ce un comportement indéfini?
Je ne comprends jamais bien ... pourquoi ça ne s'applique pas? 'a.f()' devrait se référer à l'objet complet de x. Est-ce que je le lis mal? –
@MarcoA. UB ne se produit que s'il fait référence à l'objet complet de 'x' ou à l'un des sous-objets de classe de base ** de cet objet, mais pas' x' ou à l'un de ses sous-objets de classe de base **. Dans ce cas, l'objet pertinent en construction est un 'A', et l'expression de l'objet fait référence à l'objet en construction, donc le comportement est bien défini. –
Merci de m'avoir aidé: 'Un objet qui n'est pas un sous-objet d'un autre objet est appelé un objet complet. '' Donc, n'est-ce pas 'a' référence à un objet complet ici? –