3

次の例のように、address-of-static は定数式でしたが、コンパイラ エラーが発生しました (または、これは C++0x の新機能ですか?)。

class X {
    static const int x;
    enum { y = &x };
};
4

5 に答える 5

5

変数のアドレス (静的または非静的) は、コンパイル時の定数ではありません。コンパイル時の定数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つの異なるものです。

于 2011-04-06T14:31:57.053 に答える
2

1998 年の標準 5.19(1) を読む: 「いくつかの場所で、C++ は整数または列挙定数に評価される式を必要とします...列挙子初期化子 (7.2) として...」

さらに、「整数定数式は....特に、sizeof式を除いて、関数、クラスオブジェクト、ポインター、または参照を使用してはならない....」

浮動リテラルは、整数型または列挙型にキャスト可能として明示的にリストされており、他には何もありません。

列挙子初期化子を作成するためにアドレス定数式をキャストすることは、最初の標準からは無効でした。

于 2011-04-06T14:49:43.690 に答える
1

次の理由により、プログラムの形式が正しくありません。

  • オブジェクトのアドレスが整数定数式ではありません
  • x のアドレスを取得するには、(クラス外の n) 定義が必要です
  • 整数の定数式が必要な場所以外の場所で static const 整数メンバーを使用するには、定義が必要です。
于 2011-04-06T14:33:52.790 に答える
1

これは定数式ですが、コンパイル時に決定することはできません。アドレスの実際の値は、それを実行している OS ローダーによって最終的にロードされる実行可能ファイルのメモリ領域によって異なります。列挙型メンバーには、コンパイラによって決定できる値が必要です。

乾杯、
J.

于 2011-04-06T14:35:50.403 に答える
1

静的オブジェクトのアドレスは定数式ですが、整数型を持たないため、整数定数式ではありません。そしてreinterpret_cast、それを整数型に変換しても、整数定数式でreinterpret_castは許可されていないため、整数定数式にはなりません。また、enum値の初期化子には整数定数式が必要です。

enumもちろん、コンパイラ エラーが発生する理由は、整数型を持たず、整数型への暗黙的な変換を持たない式で値を初期化しようとしているからです。.

于 2011-04-06T14:38:46.017 に答える