У C ++ 5.1.1 / 3 [expr.prim.general] сказано:
Тип і категорія значень [of
this] визначаються в рамках статичної функції-члена.
Що це означає? Як це актуально?
Зверніть увагу, що:
thisне повинен відображатися в оголошенні статичної функції-члена
У C ++ 5.1.1 / 3 [expr.prim.general] сказано:
Тип і категорія значень [of
this] визначаються в рамках статичної функції-члена.
Що це означає? Як це актуально?
Зверніть увагу, що:
thisне повинен відображатися в оголошенні статичної функції-члена
Відповіді:
Мову стандарту можна простежити до n3282 , що є дозволом для дефектів 1207 та 1017 . Зокрема, мова пропонується у запропонованій резолюції щодо дефекту 1207, і, отже, його слід розглядати в контексті стандарту, як він існував на момент усунення дефекту. На той час існувала певна стурбованість щодо переписування виразів id у вирази доступу членів за допомогою *this(9.3.1p3), зокрема в контексті оголошень типу trailing-return (див. Випуск 945 ).
Якщо ми порівняємо запропоновану резолюцію про дефект 1207 з можливою мовою в n3282 і згодом у стандарті, є одна суттєва різниця до 9.3.1p3:
Коли вираз id (5.1 [expr.prim]), який не є частиною синтаксису доступу члена класу (5.2.5 [expr.ref]) і не використовується для формування вказівника на член (5.3.1 [expr.unary .op]) використовується в оголошенні функції-члена класу
X, якщо пошук імені (3.4 [basic.lookup]) вирішує ім'я ...
Коли вираз 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 ++; можливо, можна буде видалити рудиментарну мову редакційно.