Недавно я наткнулся на следующий код:
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, я уверен, рассматривается стандартом как незаконный или неопределенный). С другой стороны, семантика необработанных указателей не обязательно должна соответствовать семантике указателей, определенных пользователем - возможно, оператор operator-> на них считается разыменованием, даже если компилятор не сгенерирует его.
A.template B
? Где уместен этот синтаксис? 15.07.2010