Почему разрешено иметь декларацию без имени?

При чтении стандарта я был очень удивлен, увидев, что на самом деле это имя является необязательным в объявлении:

struct Magic {};
int main() {
  int; // well-formed
  Magic; // well-formed
}

Для тех, кто хочет прочитать стандарт, это потому, что в простой декларации список init-declarator не является обязательным. Здесь demo.

И поэтому я действительно хочу знать, почему это разрешено. Почему я хотел бы это сделать? Мне это действительно не имеет смысла. Мое рассуждение заключается в том, что, если это не имеет смысла, зачем это допускать?

Ответ 1

В соответствии со стандартом С++ (7 деклараций)

5 В простой декларации необязательный список init-declarator может быть опущены только при объявлении класса (раздел 9) или перечисления (7.2), то есть когда spec-specifier-seq содержит либо class-specifier, специфицированный спецификатор типа с ключом класса (9.1), или спецификатор перечисления....

Таким образом, этот код

int main() {
  int; // well-formed
  Magic; // well-formed
}

плохо сформировался.

Кроме того, формально эти неправильные декларации являются определениями в соответствии с абзацем № 2 раздела 3.1. Объявления и определения и, очевидно, как таковые не имеют смысла.