次の例のように、address-of-static は定数式でしたが、コンパイラ エラーが発生しました (または、これは C++0x の新機能ですか?)。
class X {
static const int x;
enum { y = &x };
};
次の例のように、address-of-static は定数式でしたが、コンパイラ エラーが発生しました (または、これは C++0x の新機能ですか?)。
class X {
static const int x;
enum { y = &x };
};
変数のアドレス (静的または非静的) は、コンパイル時の定数ではありません。コンパイル時の定数enum
が必要です。そのため、エラーが発生しています。
実際、GCC は非常に明確なエラー メッセージを表示します。
prog.cpp:7: エラー: 'X::x' は定数式に使用できません
prog.cpp:7: エラー: `&' は定数式に使用できません
自分自身を参照してください: http://ideone.com/FJk3C
ただし、以下は許可されます。
class X {
static const int x;
enum { y = sizeof(x) }; //okay. sizeof(x) can be known at compile time!
};
コンパイル時定数と実行時定数を混同しないでください。それらは2つの異なるものです。
1998 年の標準 5.19(1) を読む: 「いくつかの場所で、C++ は整数または列挙定数に評価される式を必要とします...列挙子初期化子 (7.2) として...」
さらに、「整数定数式は....特に、sizeof
式を除いて、関数、クラスオブジェクト、ポインター、または参照を使用してはならない....」
浮動リテラルは、整数型または列挙型にキャスト可能として明示的にリストされており、他には何もありません。
列挙子初期化子を作成するためにアドレス定数式をキャストすることは、最初の標準からは無効でした。
次の理由により、プログラムの形式が正しくありません。
これは定数式ですが、コンパイル時に決定することはできません。アドレスの実際の値は、それを実行している OS ローダーによって最終的にロードされる実行可能ファイルのメモリ領域によって異なります。列挙型メンバーには、コンパイラによって決定できる値が必要です。
乾杯、
J.
静的オブジェクトのアドレスは定数式ですが、整数型を持たないため、整数定数式ではありません。そしてreinterpret_cast
、それを整数型に変換しても、整数定数式でreinterpret_cast
は許可されていないため、整数定数式にはなりません。また、enum
値の初期化子には整数定数式が必要です。
enum
もちろん、コンパイラ エラーが発生する理由は、整数型を持たず、整数型への暗黙的な変換を持たない式で値を初期化しようとしているからです。.