Явный вызов деструктора с помощью decltype

Рассмотрим следующий фрагмент:

struct Foo {};

int main()
{
   Foo f;
   f.~decltype(f)(); // fine with clang, error with gcc
   f.~decltype(auto)(); // error with both clang and gcc 
}

Правила для явного вызова деструктора обрабатываются стандартной грамматикой с pseudo-destructor-name, которая определяется следующим образом:

псевдо-деструктор имя:
    inest-name-specifier opt type-name:: ~ type-name
    шаблон вложенного имени-спецификатора simple-template-id:: ~ type-name
    ~ type-name
    ~ decltype-specifier

и

decltype-specifier:
decltype (выражение)
decltype (авто)

Тогда не должен ли приведенный выше фрагмент быть хорошо сформированным в соответствии со стандартом? (Не учитывая тот факт, что деструктор вызывается дважды, а затем третий раз на том же объекте.)

GCC Live
Clang Live

Ответ 1

Ваша программа плохо сформирована.
§7.1.6.4/[dcl.spec.auto]:

Программа, которая использует auto или decltype(auto) в контексте, явно не разрешенном в этом разделе, плохо сформирована.

Там я не могу найти ничего, что должно позволить вам написать это. Как правило, decltype(auto) используется только в объявлениях переменных и функций. То, что позволяет грамматика, не означает, что оно хорошо сформировано.

Поэтому запись чего-то типа f.~decltype(f)() не была явно запрещена и разрешена, как указано в грамматике. Тот факт, что GCC не будет скомпилировать его, скорее всего, является ошибкой.