Законно ли определять безымянную структуру? - PullRequest
16 голосов
/ 30 апреля 2019

Допустим ли следующий код?:

struct
{
    int  x;
};

Этот код просто определяет безымянную структуру. Я не собираюсь создавать объекты этого типа, и при этом я не нуждаюсь в этой структуре любым другим способом. Он просто появляется в источнике как побочный эффект некоторого сложного макроразложения.

Хотя это бесполезно, я не вижу проблем с этим. Просто еще один кусок кода, который можно скомпилировать, а затем полностью оптимизировать.

Однако в реальном мире результат сильно отличается от моих ожиданий:

GCC 8.3 сообщает об ошибке:

ошибка: абстрактный декларатор '<безымянная структура>' используется как объявление

Clang 8.0.0 также сообщает об ошибке:

ошибка: анонимные структуры и классы должны быть членами класса
предупреждение: объявление ничего не объявляет [-Wmissing-декларации]

Только MSVC 2017 не видит проблем с таким источником.

Итак, вопрос в том: кто прав? Есть ли в Стандарте соответствующая цитата, которая явно запрещает такие декларации?

Edit:
В проекте используется C ++ 11. Но сообщения об ошибках одинаковы для C ++ 98, C ++ 11 и C ++ 17.

1 Ответ

15 голосов
/ 30 апреля 2019

Нет, это не разрешено.GCC и Clang правы.

За [dcl.dcl] / 3 (7 объявлений) в N3337 (окончательный вариант C ++ 11) , объявление класса должно вводиться в одно имя дляпрограмма.Например, следующие значения недопустимы:

enum { };
typedef class { }; 

(Примечание: это не уникально для C ++ 11. В N4140 (окончательный вариант C ++ 14) это [dcl.dcl] / 5 (7 деклараций) . В N4659 (окончательный вариант C ++ 17) это [dcl.dcl] / 5 (10 деклараций) .)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...