- 1
if (!this) return;
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
+57
if (!this) return;
http://blogs.msdn.com/b/oldnewthing/archive/2014/06/27/10537746.aspx
... The expression E1->E2 is converted to the equivalent form (*(E1)).E2;...
т.е. разыменование нуля - UB
что там для метода разыменовывать?
... If E2 is a (possibly overloaded) member function...
если только он не виртуальный
Плюс эта функция может быть статичной, а может и не быть.
If E2 is a (possibly overloaded) member function, function overload resolution (13.3) is used to determine whether E1.E2 refers to a static or a non-static member function.
If it refers to a static member function and the type of E2 is “function of parameter-type-list returning T”, then E1.E2 is an lvalue; the expression designates the static member function. The type of E1.E2 is the same type as that of E2, namely “function of parameter-type-list returning T”.
Otherwise, if E1.E2 refers to a non-static member function and the type of E2 is “function of parameter-type-list cv ref-qualifieropt returning T”, then E1.E2 is a prvalue. The expression designates a non-static member function. The expression can be used only as the left-hand operand of a member function call (9.3). [ Note: Any redundant set of parentheses surrounding the expression is ignored (5.1). — end note ] The type of E1.E2 is “function of parameter-type-list cv returning T”.
Экая гомосятина ваши кресты. С ума можно сойти.
Отлично помню, какое это произвело на меня впечатление. Будто глаза открылись на C++.
Там всего 4 буквы. А мог ведь срач и на 100+ постов разгореться при нужной фазе луны и достаточном числе желающих поспорить.
Кстати та крестоконструкция и сейчас меня приводит в некий ступор.
А таким образом оказалось проще всего поправить все места, где есть обращения к структуре; точнее, не поправлять их вообще. Структура выделялась на стеке и жила весь жизненный цикл программы, а стека было очень мало - 32 килобайта, что ли? Сигсегв, короче, в некоторых местах вылезал.
Особенно код Борманда.
Пэ.Сэ. Особо нежный ароматъ сему говну придастъ если функцъия азъ виртуальна будетъ.