Здравствуйте DarkGray, Вы писали:
DG>Здравствуйте Андрей Тарасевич, Вы писали:
АТ>>Из приведенной тобой выдержки, кстати, может показаться, что к статическим членам класса можно доступаться через null-указатель. Это не так. Любое вычисляемое выражение, содержащее разыменование null-указателя порождает неопределенное поведение.
DG>А в чем это "неопределенное поведение" может выражаться при обращении через нулевой указатель к статической функции?
DG>((S*)0)->>StaticFunc();
DG>
А кто его знает. Буквально такая запись означает
*(S*) 0;
S::StaticFunc();
Неопределенное поведение вызывается именно первым выражением. Вызов статического метода тут, собственно, ни при чем. Если некоторый компилятор возьмется транслировать этот код буквально, то в ответ на первое выражение он может сгенерировать код, загружающий разыменовываемый указатель в некий выделенный адресный регистр. Вот тут-то система и рухнет.
Например, на современной платформе x86, при попытке загрузки неправильного значения в селекторный регистр (DS, ES и т.п.) программа падает сразу, а не при попытке собственно обращения к памяти через такой регистр.
Разумеется, большинство современных компиляторов проигнорирует такое выражение. Но стандарт языка этого не требует. Любой компилятор имеет право генерировать для выражения '*(S*) 0' падающий код.