Ваша программа имеет неопределенное поведение. Сказав это, есть правдоподобное объяснение того, почему вызовы f
, кажется, работают, в то время как вызовы g
вызывают странное поведение.
Функции много раз концептуально переводятся как:
void mangled_function_for_f(a* const this)
{
cout << "hello" << endl;
}
void mangled_function_for_g(a* const this)
{
cout << this->x << endl;
}
Обратите внимание, что this
не используется в f
. Следовательно, звонки на f
кажутся нормальными. Не так с g
.
PS Не рассчитывайте на мое объяснение на каждой платформе или даже на одной и той же платформе с разными опциями компилятора. Лучше всего избегать кода, который вызывает неопределенное поведение.