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


В C++ 5.1.1 / 3 [expr.подтянутый.генерал] он говорит:

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

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

Внимание:

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

1 73

1 ответ:

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

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

дефект 1207:

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

n3282 и C++11:

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

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

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