Тип `this` в статической функции-члене?

В C ++ 5.1.1 / 3 [expr.prim.general] говорится:

Тип и категория значения [this] определены в статической функции-члене.

Что это значит? Насколько это актуально?

Обратите внимание, что:

this не должен появляться в объявлении статической функции-члена


person Andrew Tomazos    schedule 13.05.2013    source источник
comment
Кто-нибудь, позвоните Бьярну!   -  person Alexander Shukaev    schedule 13.05.2013
comment
Цитируемого вами текста нет в N3242. Имеется ли где-нибудь в открытом доступе окончательный стандарт?   -  person zwol    schedule 13.05.2013
comment
Его от N3485 (ноябрь 2012 г.)   -  person Andrew Tomazos    schedule 13.05.2013
comment
@Zack: Да, но за это нужно платить. Самый дешевый источник, вероятно, находится здесь. Ближайший проект к опубликованному стандарту - n3337 < / а>   -  person Mike Seymour    schedule 13.05.2013


Ответы (1)


Язык в стандарте можно отследить до n3282, который является устранением дефектов 1207 и 1017. В частности, формулировка появляется в предлагаемом разрешении для дефекта 1207, и поэтому ее следует рассматривать в контексте стандарта, действовавшего на момент устранения дефекта. В то время существовала некоторая озабоченность по поводу переписывания id-выражений в выражения доступа к членам с использованием *this (9.3.1p3), в частности, в контексте объявлений конечного возвращаемого типа (см. Issue 945).

Если мы сравним предложенное разрешение дефекта 1207 с возможным языком в n3282, а затем и в стандарте, есть одно существенное отличие от 9.3.1p3:

Дефект 1207:

Когда id-выражение (5.1 [expr.prim]), которое не является частью синтаксиса доступа к члену класса (5.2.5 [expr.ref]) и не используется для формирования указателя на член (5.3.1 [expr.unary .op]) используется в объявлении функции-члена класса X, если поиск имени (3.4 [basic.lookup]) разрешает имя ...

n3282 и C ++ 11:

Когда id-выражение (5.1 [expr.prim]), которое не является частью синтаксиса доступа к члену класса (5.2.5 [expr.ref]) и не используется для формирования указателя на член (5.3.1 [expr.unary .op]) используется в члене класса X в контексте, где можно использовать this (5.1.1 [expr.prim.general]), если поиск по имени (3.4 [basic.lookup] ) разрешает имя [...]

Очевидно, что предлагаемое решение для дефекта 1207 основывалось на убеждении, что выражения id (в статический член) в статических функциях-членах должны быть преобразованы в *this выражения доступа к членам и, следовательно, потребуется доступ к категории типа и значения this. К моменту написания n3282 это было решено в пользу преобразования квалифицированного идентификатора (также 9.3.1p3), которое не требует this, но язык в 5.1.1p3 оставался рудиментарным.

Я бы рекомендовал поднять этот вопрос в группе новостей, посвященной обсуждению стандартов C ++; возможно, удастся удалить рудиментарную формулировку редакционным путем.

person ecatmur    schedule 13.05.2013
comment
Окей, плохая почта isocpp / обсуждение. - person Andrew Tomazos; 13.05.2013
comment
Если бы мог, я бы дал вам отличный значок для ответа. - person Luchian Grigore; 13.05.2013
comment
@LuchianGrigore: Тебе не придется. ;) - person ereOn; 13.05.2013
comment
Хорошо, я перешел на isocpp / обсудить здесь - person Andrew Tomazos; 13.05.2013