Скотт Мейерс пишет в «Эффективном современном C++», пункт 30, стр. 210, что существует
нет необходимости определять интегральные
static const
элементы данных в классах; достаточно одних заявлений,
тогда пример кода
class Widget {
public:
static const std::size_t MinVals = 28; // MinVals' declaration;
...
};
... // no defn. for MinVals
std::vector<int> widgetData;
widgetData.reserve(Widget::MinVals); // use of MinVals
Я был убежден, что static const std::size_t MinVals = 28;
является объявлением, а также определением, поскольку оно дает значение MinVals
, но комментарий, кажется, утверждает, что это только объявление; второй комментарий фактически утверждает, что определения нет. Текст после кода действительно читается
MinVals
не имеет определения.
Что подтверждает, что static const std::size_t MinVals = 28;
не является определением, так что я немного запутался.
cppreference мне не очень помогает (выделено жирным курсивом):
Если элемент данных
static
интегрального или перечисляемого типа объявленconst
(а неvolatile
), его можно инициализировать с помощью инициализатора, в котором каждое выражение является константным выражением, правильно внутри определения класса:struct X { const static int n = 1; const static int m{2}; // since C++11 const static int k; }; const int X::k = 3;
но первые две строки в классе выглядят для меня определениями.
То же самое касается следующего примера cppreference:
struct X { static const int n = 1; static constexpr int m = 4; }; const int *p = &X::n, *q = &X::m; // X::n and X::m are odr-used const int X::n; // … so a definition is necessary constexpr int X::m; // … (except for X::m in C++17)
где я бы сказал, что static const int n = 1;
- это определение, но это не так, основываясь на предпоследнем комментарии.
The declaration of a non-inline static data member in its class definition is not a definition [...]
. Но (3) непосредственно для целочисленных типов с инициализатором и этот абзац не поможет, если это объявление или определение. - person Werner Henze   schedule 17.05.2020inline static
, и это здорово. - person Matthieu M.   schedule 18.05.2020