Если память выделена для объекта (например, через объединение), но конструктор еще не был вызван, допустимо ли вызывать один из нестатических методов объекта, предполагая, что метод не зависит от значения каких-либо переменных-членов?
Я немного исследовал и нашел некоторую информацию о «вариантах членов», но не смог найти информацию, относящуюся к этому примеру.
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. Но мне интересно, не вызываю ли я здесь какое-то незаконное или неопределенное поведение.