Допустим ли следующий код?:
struct
{
int x;
};
Этот код просто определяет безымянную структуру. Я не собираюсь создавать объекты этого типа, и при этом я не нуждаюсь в этой структуре любым другим способом. Он просто появляется в источнике как побочный эффект некоторого сложного макроразложения.
Хотя это бесполезно, я не вижу проблем с этим. Просто еще один кусок кода, который можно скомпилировать, а затем полностью оптимизировать.
Однако в реальном мире результат сильно отличается от моих ожиданий:
GCC 8.3 сообщает об ошибке:
ошибка: абстрактный декларатор '<безымянная структура>' используется как объявление
Clang 8.0.0 также сообщает об ошибке:
ошибка: анонимные структуры и классы должны быть членами класса
предупреждение: объявление ничего не объявляет [-Wmissing-декларации]
Только MSVC 2017 не видит проблем с таким источником.
Итак, вопрос в том: кто прав? Есть ли в Стандарте соответствующая цитата, которая явно запрещает такие декларации?
Edit:
В проекте используется C ++ 11. Но сообщения об ошибках одинаковы для C ++ 98, C ++ 11 и C ++ 17.