Что значит static class

250
18 июня 2018, 19:10

Что означает данная конструкция

static class Class {};

если конструкция не имеет смысла тогда почему студия компилирует ее.

Answer 1

Смысл может появиться, если совместно с определением класса будет определена переменная, то есть код трансформируется в следующий:

static class Class {} var;

Это будет значит, что создаётся переменная только что определённого класса. То, что Visual Studio разрешает подобную конструкцию, т.е. выдаёт всего лишь предупреждение, а не ошибку компиляции, является особенностью компилятора.

Причём var в зависимости от контекста может быть как определением глобальной переменной, доступной только в пределах текущего файла, если это написано на уровне глобального пространства имён. А может быть и объявлением статической переменной объемлющего класса, если написано внутри определения класса:

struct X {
    static class Class {} var;
};

В таком случае, для использования var её ещё нужно будет определить вне X:

X::Class X::var;
Answer 2

Такая конструкция ничего не значит - она не компилируема в приниципе. С++ испокон веков разрешал спецификаторы класса хранения (static в данном случае) только в объявлениях объектов или функций.

10.1.1 Storage class specifiers
4 The static specifier can be applied only to names of variables and functions and to anonymous unions [...]

http://eel.is/c++draft/dcl.stc#4

Данная конструкция не объявляет ни объекта, ни функции. Любой С++ компилятор обязан выдать диагностическое сообщение в ответ на такую конструкцию.

Понятия "компилирует" или "не компилирует" в мире С++ не существует. Корректность С++ кода определяется в первую очередь наличием или отсутствием диагностических сообщений компилятора.

В данном случае решение компилятора продолжить компиляцию после выдачи диагностического сообщения, возможно, вызвано наследием языка С, в котором такие бессмысленные спецификаторы класса хранения являются допустимыми (хоть и тоже бессмысленными).

READ ALSO
std::future_error при пересоздании std::promise

std::future_error при пересоздании std::promise

Нужно синхронизировать два потока, пока один не запросит данные, другой их не отдает и ждет запроса на данные

225
Абстрактный класс. Наследование

Абстрактный класс. Наследование

Допустим, планируется какая-то система классов, например, устройствУ каждого устройства есть некоторые общие члены, например имя устройства,...

206
Где слабые места в методе?

Где слабые места в методе?

Есть метод, который парсит строку вида ширина:долгота@ширина:долгота@

233
Понимание работы QListWidgetItem

Понимание работы QListWidgetItem

У меня есть список элементов QListWidget в этом списке хранятся QListWidgetItem

174