я наткнулся на следующий код недавно:Является ли это законным/четко определенным C++ для вызова нестатического метода, который не имеет доступа к элементам через нулевой указатель?
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++ просто функции, которые неявно передается указатель на «это» и «это» может быть проверен, чтобы быть NULL, как и любой другой указатель. Очевидно, что этот код запутан и плох, даже если он не падает; было бы довольно сложно переходить через код в отладчике, см. указатель NULL, который должен вызвать метод, вызываемый на нем, а затем не увидеть ожидаемый сбой. Мой вопрос: нарушает ли стандарт C++ вызов SomeFooPtr->bar()
, где SomeFooPtr == NULL
?
Мне кажется, что это не так, потому что пользователь определил operator-> возвращает указатель, а это означает, что даже если этот указатель имеет значение NULL, он определенно не был разыменован (разыменование указателя NULL, я уверен, считается по стандарту, как незаконный или неопределенный). С другой стороны, семантика исходных указателей необязательно должна соответствовать семантике определяемых пользователем указателей - возможно, оператор-> на них считается разыменованием, даже если компилятор не будет генерировать его.
Duplicate: http://stackoverflow.com/questions/2474018/when-does-invoking-a-member-function-on-a-null-instance-result-in-undefined-behav – GManNickG