Хорошо, я знаю, что технически это неопределенное поведение, но, тем не менее, я видел это не раз в рабочем коде. И, пожалуйста, поправьте меня, если я ошибаюсь, но я также слышал, что некоторые люди используют эту «функцию» как несколько законную замену отсутствующего аспекта текущего стандарта C ++, а именно невозможности получить адрес (ну, смещение действительно) функции-члена. Например, это не популярная реализация библиотеки PCRE (Perl-совместимых регулярных выражений):
#ifndef offsetof
#define offsetof(p_type,field) ((size_t)&(((p_type *)0)->field))
#endif
Можно спорить, является ли использование такой языковой тонкости в случае, подобном этому, допустимым или нет, или даже необходимым, но я также видел, как оно использовалось так:
struct Result
{
void stat()
{
if(this)
// do something...
else
// do something else...
}
};
// ...somewhere else in the code...
((Result*)0)->stat();
Это работает просто отлично! Он избегает разыменования нулевого указателя, проверяя наличие this
, и не пытается получить доступ к членам класса в блоке else
. Пока эти охранники на месте, это законный код, верно? Таким образом, остается вопрос: существует ли практический вариант использования, в котором было бы полезно использовать такую конструкцию? Я особенно обеспокоен вторым случаем, так как первый случай - больше обходного пути для языкового ограничения. Или это?
PS. Извините за кастинги в стиле C, к сожалению, люди все еще предпочитают печатать меньше, если могут.