我很好奇以下行为:
#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;
}
是否需要打印预期结果?还是未定义的行为?
答案 0 :(得分:6)
这是合法的。 §12.7[class.cdtor] / p4:
可以调用成员函数,包括虚函数(10.3) 在施工或毁坏期间(12.6.2)。当一个虚函数 从构造函数或从构造函数直接或间接调用 析构函数,包括在构造或破坏期间 class的非静态数据成员,以及调用的对象 apply是构造或销毁中的对象(称为
x
), 被调用的函数是构造函数中的最终覆盖 析构函数的类,而不是在更派生的类中重写它。 如果虚函数调用使用显式类成员访问 (5.2.5)并且对象表达式引用x
的完整对象 或者该对象的基类子对象之一,但不是x
或其中之一 它的基类子对象,行为未定义。
UB案例不适用于此。