static const
значения обрабатываются как r-значения точно так же, как enum
в 99% кода, который вы увидите. Постоянные r-значения никогда не генерируют память для них. Преимущество enum
констант в том, что они не могут стать l-значениями в этом другом 1%. Значения static const
являются типобезопасными и допускают значения типа float, c-strings и т. Д.
Компилятор сделает Foo::Life
значением l, если с ним связана память. Обычный способ сделать это - взять его адрес. например &Foo::Life;
Вот тонкий пример, где GCC будет использовать адрес:
int foo = rand()? Foo::Life: Foo::Everthing;
Код, сгенерированный компилятором, использует адреса Life
и Everything
. Хуже того, это приводит только к ошибке компоновщика об отсутствующих адресах для Foo::Life
и Foo::Everything
. Такое поведение полностью соответствует стандарту, хотя, очевидно, нежелательно. Существуют и другие способы компиляции, и все это соответствует стандарту.
Если у вас есть соответствующий компилятор c ++ 11, правильный код будет
class Foo {
public:
constexpr size_t Life = 42;
};
Это гарантированно всегда будет l-значением, и оно безопасно для типов, лучшее из обоих миров.