static const
値は、コードの 99% と同じようenum
に r 値として扱われます。定数 r 値には、メモリが生成されることはありません。定数の利点enum
は、他の 1% の左辺値にならないことです。static const
値はタイプ セーフであり、float、c-string などを使用できます。
Foo::Life
メモリが関連付けられている場合、コンパイラは左辺値を作成します。これを行う通常の方法は、そのアドレスを取得することです。例えば&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;
};
これは常に左辺値であることが保証されており、タイプセーフであり、両方の長所を備えています。