Здравствуйте 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) или не могу? То есть будет это приводить к падению или не будет?