3 Если объявление объявляет функцию-член или шаблон функции-члена класса X, выражение this является значением знака типа "указатель на cv-qualifier-seq X" между необязательным 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 правильно отклоняет это.