如果为一个对象(例如通过联合)设置了内存,但尚未调用构造函数,假设该方法不依赖于任何成员变量的值,调用对象的非静态方法是否合法?
我进行了一些研究,并发现了一些有关“变量成员”的信息,但我没有找到与此示例相关的信息。
在这个例子中,我在不调用构造函数的情况下调用print()。意图是稍后调用构造函数,但即使在调用构造函数之前,我们也知道变量a将驻留在哪里。显然,在这一点上,a的值未初始化,但print()并不关心其值。
当使用gcc和clang编译c++11时,这似乎按预期工作。但我想知道我是否在这里引用了某些非法或未定义的行为。
我进行了一些研究,并发现了一些有关“变量成员”的信息,但我没有找到与此示例相关的信息。
class D {
public:
D() { printf("D constructor!\n"); }
int a = 123;
void print () const {
printf("Pointer: %p\n", &a);
};
};
class C {
public:
C() {};
union {
D memory;
};
};
int main() {
C c;
c.memory.print();
}
在这个例子中,我在不调用构造函数的情况下调用print()。意图是稍后调用构造函数,但即使在调用构造函数之前,我们也知道变量a将驻留在哪里。显然,在这一点上,a的值未初始化,但print()并不关心其值。
当使用gcc和clang编译c++11时,这似乎按预期工作。但我想知道我是否在这里引用了某些非法或未定义的行为。
C c;
构造了变量c
。 - user207421c.memory
,因为那是一个变体成员,而C
的构造函数没有提供初始化程序... - Michael Kenzel