Рассмотрим следующий фрагмент:
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 (авто)
Тогда не должен ли приведенный выше фрагмент быть хорошо сформированным в соответствии со стандартом? (Не учитывая тот факт, что деструктор вызывается дважды, а затем третий раз на том же объекте.)