Доступ к членам класса: раздел 3.4.5, пункт 2: пункт из черновика N3290 C++

Доступ к членам класса: раздел 3.4.5, пункт 2:

Если id-выражение в доступе к члену класса (5.2.5) является неполным id, а тип выражения объекта относится к типу класса C, неквалифицированный id просматривается в области видимости класса C. < strong>Для вызова псевдодеструктора (5.2.4) неквалифицированный идентификатор ищется в контексте полного постфиксного выражения.

здесь, в приведенном выше утверждении: для вызова псевдодеструктора (5.2.4) неквалифицированный идентификатор просматривается в контексте полного постфиксного выражения.

кто-нибудь может объяснить это с точки зрения программы (я знаю о вызове псевдодеструктора)?


person user751747    schedule 29.08.2011    source источник


Ответы (1)


Псевдодеструктор — это подобный деструктору синтаксис, вызываемый для типа, не являющегося классом:

typedef int I;
I x;
x.I::~I();

Если бы это было разобрано «наивно», то парсер увидел бы следующие токены:

неквалифицированный идентификатор (x), имя типа (I), ::, побитовое отрицание, имя типа (I), (, ), ;.

«Побитовое отрицание» — это проблема, потому что если вы только что написали это:

~I();

Тогда это сформирует правильное выражение с другой семантикой. А именно, то же, что и ~0. Следовательно, приведенное выше выражение должно быть проанализировано по-другому, чтобы учесть контекст псевдодеструктора.

person Konrad Rudolph    schedule 29.08.2011
comment
@user751747 user751747 Не уверен, что вы имеете в виду. Просто поместите приведенный выше код в функцию main, и вы получите свою программу. - person Konrad Rudolph; 30.08.2011