Недавно я наткнулся на следующий код:
class Foo
{
public:
void bar();
// .. other stuff
};
void Foo::bar()
{
if(!this) {
// .. do some stuff without accessing any data members
return;
}
// .. do normal actions using data members
}
Код компилируется, потому что в C ++ методы - это просто функции, которым неявно передается указатель на «this», и «this» может быть проверено на NULL.как и любой другой указатель.Очевидно, что этот код сбивает с толку и является плохой практикой, даже если он не падает;было бы довольно странно проходить по коду в отладчике, видеть, что указатель NULL собирается вызвать метод, а затем не видеть ожидаемого сбоя.Мой вопрос: нарушает ли он стандарт C ++ для вызова SomeFooPtr->bar()
, где SomeFooPtr == NULL
?
Мне приходит в голову, что это может не произойти, потому что определенный пользователем оператор-> возвращает указатель, что означает, что даже еслиэтот указатель равен NULL, он определенно не был разыменован (разыменование NULL-указателя, я уверен, рассматривается стандартом как недопустимое или неопределенное).С другой стороны, семантика необработанных указателей не обязательно должна соответствовать семантике пользовательских указателей - возможно, оператор-> на них считается разыменованием, даже если компилятор не сгенерирует его.