我对以下行为很好奇:
#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;
}
这是否需要打印预期结果?还是未定义的行为?
a.f()
应该指的是x的完整对象。我读错了吗? - Marco A.x
的完整对象或该对象的基类子对象之一但不包括x
或其基类子对象之一时,才会发生UB错误。在这种情况下,正在构建的相关对象是一个A
,而对象表达式引用正在构建的对象,因此行为是明确定义的。 - T.C.不是任何其他对象的子对象的对象称为完整对象。
,所以这里的a
不是指一个完整的对象吗? - Marco A.a
是一个完整的对象,但这里没有UB,因为它也是x
- 即当前正在构建的对象。 - T.C.x
的完整对象或该对象的一个基类子对象但不是x
或其一个基类子对象时,才会出现UB。”- 对我来说听起来一样... - David G