jestem ciekawy co do zachowania z następujących powodów:Wywołanie funkcji z wirtualnego konstruktora członkiem
#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;
}
Czy to wymagane wydrukować oczekiwanego rezultatu? Czy jest to niezdefiniowane zachowanie?
Nigdy nie rozumiem tego .. dlaczego to się nie dzieje? 'a.f()' powinno odnosić się do kompletnego obiektu x. Czy czytam to źle? –
@MarcoA. UB występuje tylko wtedy, gdy odnosi się do kompletnego obiektu 'x' lub jednego z podobiektów klasy bazowej tego obiektu **, ale nie do' x' lub do jednego z jego podobiektów klasy podstawowej **. W tym przypadku odpowiednim obiektem w budowie jest "A", a wyrażenie obiektowe odnosi się do obiektu w trakcie budowy, więc zachowanie jest dobrze zdefiniowane. –
Dzięki za pomoc: "Obiekt, który nie jest podobiektem żadnego innego obiektu, nazywany jest obiektem pełnym.", Więc czy "a" nie odnosi się tutaj do kompletnego obiektu? –