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


75

У C ++ 5.1.1 / 3 [expr.prim.general] сказано:

Тип і категорія значень [of this] визначаються в рамках статичної функції-члена.

Що це означає? Як це актуально?

Зверніть увагу, що:

this не повинен відображатися в оголошенні статичної функції-члена


31
Хтось, телефонуйте Бьярне!
Олександр Шукаєв

Текст, який ви цитуєте, відсутній у N3242. Чи доступний десь остаточний стандарт?
zwol

Це від N3485 (листопад 2012)
Ендрю Томазос,

3
@Zack: Так, але за це потрібно платити. Найдешевше джерело, мабуть, тут . Найближчий проект до опублікованого стандарту - n3337
Майк Сеймур,

Чи отримали ви розумне пояснення натякнутої "рудиментарної мови", згаданої @ecatmur у своїй відповіді нижче? Я бачив вашу дискусію з Єнсом Маурером тут , але AFAICT на ваше запитання поки що не отримали відповіді.
Belloc

Відповіді:


78

Мову стандарту можна простежити до n3282 , що є дозволом для дефектів 1207 та 1017 . Зокрема, мова пропонується у запропонованій резолюції щодо дефекту 1207, і, отже, його слід розглядати в контексті стандарту, як він існував на момент усунення дефекту. На той час існувала певна стурбованість щодо переписування виразів id у вирази доступу членів за допомогою *this(9.3.1p3), зокрема в контексті оголошень типу trailing-return (див. Випуск 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 ++; можливо, можна буде видалити рудиментарну мову редакційно.


Гаразд поштою isocpp / обговорити.
Ендрю Томазос,

Я б дав вам чудовий значок відповіді, якби міг.
Luchian Grigore

@LuchianGrigore: Вам не доведеться. ;)
ере

1
Гаразд, я переклав до isocpp / обговорюю тут
Ендрю Томазос,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.