Тип " это " в статической функции-члене?
В C++ 5.1.1 / 3 [expr.подтянутый.генерал] он говорит:
категория типа и значения [of
this
] определяются в статической функции-члене.
что это значит? Насколько это актуально?
Внимание:
this
не должны появляться в объявлении статической функции-члена
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++; возможно, удастся удалить рудиментарный язык в редакционном порядке.