Re[2]: ((SA*)0)->Func();
От: DarkGray Россия http://blog.metatech.ru/post/ogni-razrabotki.aspx
Дата: 26.04.02 20:17
Оценка:
Здравствуйте IT, Вы писали:

IT>Здравствуйте DarkGray, Вы писали:


DG>>Должен ли по стандарту работать следующий код?


IT>Давай перепишем и посмотрим причём тут стандарт:


IT>
IT>struct SA
IT>{
IT>  void Func(); //невиртуальная и не важно

//как раз важно что функция не виртуальная, для виртуальной функции все будет падать со свистом при нулевом указателе

IT>  static void StaticFunc();
IT>};

IT>void f(SA*)
IT>{
IT>  SA->Func(); // откуда компилятору знать, что у программера на уме
IT>}

IT>void main()
IT>{
IT>  SA::StaticFunc(); // можно обойтись и без объекта
IT>  f((SA*)0);        // мало ли чего можно компилятору подсунуть
IT>}
IT>


Наверное, не правильно вопрос задал...

Написано ли где-нибудь в стандарте, что компилятор не должен закладываться на то, что this всегда не равен нулю?

Для виртуальный функций — понятно. Компилятор не явно закладывается на то, что this не нуль и этот указатель использует в своих целях, по нему ищет таблицу виртуальных функции.
В случае нулевого указателя все падает.

Для статик функции то же — понятно, так как this-а у них совсем нет.

А вот для обычных функций не понятно. Могу ли я в качестве this при вызове использовать произвольное значение (в частности NULL) или не могу? То есть будет это приводить к падению или не будет?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.