Потому что иначе возник бы вопрос, в какой единице компиляции (например, объектном файле) находится значение. Каждый файл, содержащий заголовок с определением класса, будет пытаться создать объект, который будет присвоен статическому значению при создании, потенциально вызывая непредсказуемое поведение.
Это не просто назначение , которое не работает;Вам также все еще нужно определить статическое значение вне объявления класса.например,
class Foo
{
static std::string s;
};
std::string Foo::s = "foo";
Я не знаю, является ли это хорошей причиной, но я все равно подозреваю, что в этом вся логика.