Явный вызов деструктора с помощью 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 не будет скомпилировать его, скорее всего, является ошибкой.