Когда вызов функции-члена для нулевого экземпляра приводит к неопределенному поведению?
Рассмотрим следующий код:
#include <iostream>
struct foo
{
// (a):
void bar() { std::cout << "gman was here" << std::endl; }
// (b):
void baz() { x = 5; }
int x;
};
int main()
{
foo* f = 0;
f->bar(); // (a)
f->baz(); // (b)
}
Мы ожидаем(b)
сбой, потому что нет соответствующего членаx
для нулевого указателя. На практике,(a)
не падает, потому чтоthis
указатель никогда не используется.
Так как(b)
разыменовываетthis
указатель ((*this).x = 5;
), а такжеthis
имеет значение null, программа вводит неопределенное поведение, поскольку разыменование null всегда называется неопределенным поведением.
Есть ли(a)
привести к неопределенному поведению? Как насчет, если обе функции (иx
) статичны?