В основном это связано с тем, что статические члены должны быть определены точно в одной единице перевода, чтобы не нарушать правило One-Definition . Если язык должен был разрешить что-то вроде:
struct Gizmo
{
static string name = "Foo";
};
, тогда в каждой единицы перевода будет определено name
, что #include
s этот файл заголовка.
C ++ позволяет вам для определения интегральных статических членов в объявлении, но вы все равно должны включать определение в пределах одной единицы перевода, но это всего лишь ярлык или синтаксический сахар. Таким образом, это разрешено:
struct Gizmo
{
static const int count = 42;
};
Пока a) выражение является const
интегральным или перечисляемым типом, b) выражение может быть оценено во время компиляции, и c) все еще определение где-то, что не нарушает одно правило определения:
file: gizmo.cpp
#include "gizmo.h"
const int Gizmo::count;