Ответ 1
Хорошо, вот что я нашел в стандарте (N3337), хотя:
7.1.6.2 Спецификаторы простого типа [dcl.type.simple]
4 Тип, обозначаемый
decltype(e)
, определяется следующим образом:
- еслиe
- это unparenthesized id-expression или unparenthesized class member access (5.2.5),decltype(e)
- это тип объекта, названногоe
. Если такой объект отсутствует или еслиe
называет набор перегруженных функций, программа плохо сформирована,
- в противном случае, еслиe
- значение x,decltype(e)
-T&&
, гдеT
- типe
; - в противном случае, еслиe
- значение l,decltype(e)
-T&
, гдеT
- типe
; - в противном случаеdecltype(e)
является типомe
.
Операндdecltype
specifier - неоцениваемый операнд (раздел 5).
и
5.1.1 Общие сведения [expr.prim.general]
3 Если декларация объявляет функцию-член или функцию-член шаблон класса
X
, выражениеthis
является значением класса "указатель на cv-qualifier-seqX
" между необязательным cv-qualifer-seqи конец функции-определения, member-declarator или <Я > описатель. Он не должен появляться перед необязательным cv-qualifier-seqи он не должен появляться в объявлении статического члена (хотя его тип и категория значений определены в пределах статическая функция-член, поскольку они находятся внутри нестатического элемента функция). [ Примечание: это потому, что совпадение объявлений не происходит пока не будет известен полный декларатор. - end note] В отличие от объекта выражение в других контекстах,*this
не обязано быть полным тип для доступа к члену класса (5.2.5) вне члена функция корпус. [ Примечание: только участники класса, объявленные до декларация видна. - end note]
Предыдущая ссылка на §9.3.2 является ошибкой, так как это касается тела функции-члена, как указано ниже в комментарии от MWid.
9.3.2 Указатель `this` [class.this] 1 В теле нестатической (9.3) функции-члена ключевое слово `this` является выражением prvalue, значением которого является адрес объект, для которого вызывается функция. Тип `this` в член-функция класса `X` -` X * `. Если функция-член объявленный `const`, тип` this` является `const X *`, если член функция объявлена `volatile`, тип` this` является `volatile X *`, и если функция-член объявлена `const volatile`, тип `this` является` const volatile X * `.Дел >
Так выглядит gcc неправильно.