Здравствуйте DarkGray, Вы писали:
DG>Написано ли где-нибудь в стандарте, что компилятор не должен закладываться на то, что this всегда не равен нулю?
Может написано, может не написано. Это, в принципе, неважно. Стандарт вместо этого совершенно глухо запрещает все возможные пути падания внутрь метода объекта через null-указатель. А именно: запрещается разадресовывать null-указатель. Это автоматически означает, что, пока поведение программы определено, внутри метода объекта this никак не может быть равен null-указателю.
DG>А вот для обычных функций не понятно. Могу ли я в качестве this при вызове использовать произвольное значение (в частности NULL) или не могу? То есть будет это приводить к падению или не будет?
Будет приводить к неопределенному поведению. А будет падать или нет — это уже дело десятое. Твоя попытка защититься от такой ситуации путем сравнения 'this' с 'NULL' в рамках языка C++ ситуацию никак не спасает, т.к. у этому моменту ее уже поздно спасать.
Даже если некоторый компилятор все таки делает "корректный" вызов метода через null-указатель, все равно проверка 'this' на NULL в общем случае работать не будет. Т.к., например, нигде не гарантируется, что указатель 'this' базового класса совпадает с указателем 'this' класса-наследника. Даже при одиночном наследовании. А при множественном наследовании твоя проверка в принципе не способна отловить NULL. Посмотри что получится если сделать так:
struct SX { int x; };
struct SB : SX, SA {};
((SB*) 0)->Func();