abbra: (Default)
[personal profile] abbra
Не хотите больше быть программистом? Оставьте свой след в истории:
http://blog.8thlight.com/dariusz-pasciak/2012/07/03/dereferencing-null-pointer-without-a-seg-fault.html

После того, как прочитали, заходите под кат и ответьте на вопрос: Скажите, а вас учили, что оператор -> над классами в C++ эквивалентен разыменованию указателя в C?

Что интересно, в стандарте С++ в 5.2.5 (Class member access) в третьем абзаце написано:
If E1 has the type “pointer to class X,” then the expression E1->E2 is converted to the equivalent form (*(E1)).E2; the remainder of 5.2.5 will address only the first option (dot).

Правда, 13.5.6 (Class member access) говорит уже более аккуратно об этом:
An expression x->m is interpreted as (x.operator->())->m for a class object x of type T if T::operator->() exists and if the operator is selected as the best match function by the overload resolution mechanism (13.3)

Date: 2012-07-11 10:19 am (UTC)
From: [identity profile] b-a-t.livejournal.com
А не (x.operator->()).m?

Date: 2012-07-11 10:21 am (UTC)
From: [identity profile] blacklion.livejournal.com
Это если этот оператор есть, о чём сообщает вторая цитата из стандарта. А если нету — просто разыменовать. А если метод не виртуальный (статическая линковка), то this не нужен. А если в методе нет обращения к виртуальным методам или не-статическим полям, то this по-прежнему не нужен и может быть любым мусором, в том числе и NULL. Всё логично, на самом деле.

Date: 2012-07-11 11:35 am (UTC)
From: [identity profile] b-a-t.livejournal.com
Не понял, к чему ты это все. Про NULL все достаточно понятно и почти ожидаемо.

Мой вопрос был про то, что operator->() должон бы возвращать T* в общем случае, в результате чего выполнялось бы выражение из первого абзаца. А две стрелочки - почти рекурсия.

Впрочем, если возвращается указатель, то -> сводится к простому типу и произойдет то самое разыменовывыние (*X).m.

Date: 2012-07-11 10:22 am (UTC)
From: [identity profile] blacklion.livejournal.com
Более того, если operatot->>() не будет трогать this, то тоже будет работать.

April 2016

S M T W T F S
     12
3456789
1011121314 1516
17181920212223
24252627282930

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Jul. 4th, 2025 10:29 pm
Powered by Dreamwidth Studios