Ответ 1
Цитата n4140 (примерно С++ 14) [expr.prim.general]:
3 Если объявление объявляет функцию-член или шаблон функции-члена класса
X
, выражениеthis
является значением знака типа "указатель на cv-qualifier-seqX
" между необязательным cv-qualifer -seq и конец определения функции, объявления-участника или декларатора. Он не должен появляться перед необязательным cv-qualifier-seq и не должен появляться в объявлении статической функции-члена (хотя его тип и категория значений определяются в статической функции-члене, поскольку они находятся в нестатической функции-члене), [...]4 В противном случае, если член-декларатор объявляет нестатический элемент данных (9.2) класса
X
, выражение это значение знака типа "указатель наX
" в необязательном скобке- равной инициализатор. Он не должен появляться в другом месте в деклараторе участника.
Поскольку вы не объявляете шаблон-член или шаблон функции-члена, p3 не применяется, но это то, что сделает код действительным для случая без указателя, где вы фактически объявляете функцию-член: тип возвращаемого возврата находится между необязательным cv-qualifier-seq и концом декларатора, как яснее в определении функции-члена const
:
auto foo() const -> decltype(this) { }
p4 - это то, что здесь применяется. Это позволяет this
появляться только в инициализаторе. Вы кладете его в другое место. p3 не применяется, поэтому ICC правильно отклоняет это.