В стандарте указано, что разыменование нулевого указателя приводит к поведению undefined. Но что такое "нулевой указатель"? В следующем коде мы называем "нулевой указатель":
struct X
{
static X* get() { return reinterpret_cast<X*>(1); }
void f() { }
};
int main()
{
X* x = 0;
(*x).f(); // the null pointer? (1)
x = X::get();
(*x).f(); // the null pointer? (2)
x = reinterpret_cast<X*>( X::get() - X::get() );
(*x).f(); // the null pointer? (3)
(*(X*)0).f(); // I think that this the only null pointer here (4)
}
Моя мысль заключается в том, что разыменование нулевого указателя происходит только в последнем случае. Я прав? Есть ли разница между нулевыми указателями времени компиляции и временем выполнения в соответствии со стандартом С++?