Является ли эта функция указателем с `this` в концевом возврате типа законным?

class C {
  auto (*foo)() -> decltype(this);
};

Этот код принимается GCC, MSVC и clang, но не icc.

Ответ 1

Цитата n4140 (примерно С++ 14) [expr.prim.general]:

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 правильно отклоняет это.