私のC++コンパイラは、クラス定義でintメンバ変数を初期化しようとすると文句を言います。 「静的const整数データメンバのみをクラス内で初期化することができます」と表示されます。この制限の背後にある理論的根拠を説明してください(可能であれば可能です)。C++でintegerメンバ変数(const staticではない)の初期化が許可されないのはなぜですか?
答えて
理論的根拠は、C++の「低レベル」の性質です。これを可能にするなら、コンパイラはすべてのコンストラクタの初期化コードを生成する必要があります。
基本クラスのコンストラクタが明示的に呼び出されない場合でも、基本クラスのメンバーを派生クラスの構築時に初期化する必要があるかもしれません。
スタティックconst積分変数は、オブジェクト作成時にインテラリゼーションを行う必要はありません。
私はちょうどあなたがこれを行うにしようとしている推測している:
class foo {
int m_iX = 5;
};
すべての新しく作成されたインスタンスは、この変数を初期化する必要がありますので、これは、コンストラクタで実行されるコードが必要になります。 C++では、コンストラクタ中に実行されるすべてのコードがコンストラクタ自体に(幸運にも)含まれているので、クラスの構築に伴うものはすぐに分かります。さらに、クラスは任意の数のコンストラクタ(コピーコンストラクタを含む)を持つことができるので、この初期化を行うべきかどうかは不明瞭です。
あなたはこれを行うことができます。これは、あなたがfoo::CONSTANT
を使用することができます
class foo {
enum {
CONSTANT = 8
};
};
。これはインスタンス単位ではなくクラス単位で実行されるため動作します。
同様に、あなたがこれを行うことができます:.cppファイルで
class foo {
static int sm_iX;
};
:
int foo::sm_ix = 5;
を繰り返しますが、これはクラスごとのではなく、インスタンスごと、およびこのような関連性がないようです実際のインスタンスの構築。
ボーナス - このint constを宣言すると、多くのコンパイラがコンパイル時に評価することがあります。いずれかのコンストラクタで:
アルン、
私はあなたの質問は、あなたが何をしたい達成するために
Compiler Error C2864
に関連していると信じて、C++は、インスタンスの特定のメンバー(非静的、非コストIE)を初期化する必要があります本文または初期化リスト
C++は、非静的データメンバを初期化するコンストラクタ初期化子を使用しているため、静的な制限が存在する:
struct Example {
int n;
Example() : n(42) {}
};
CONST場合は(かなりの周りに他の方法よりも)特別扱いされているため、CONST制限が存在するので、静的const integralメンバは、通常、名前空間スコープ(C++ 03§7.1.5.1p2、興味があれば)のconst変数に似た内部リンケージがあるかのように扱うことができます。これは、配列サイズなどの整数定数式でメンバーを使用することが主に有益です。
現在の標準では許可されていないためです。 According to Bjarne、これをC++ 0xで行うことができます。本当に必要な場合は、コンパイラをC++ 0x(GCCの-std=c++0x
)に設定し、コンパイラがそれをサポートしているかどうか確認してください。
- 1. なぜJavaがコンストラクタ内のstatic final変数(static final int dなど)の初期化を許可しないのですか?
- 2. 再割り当てのコレクション初期化が許可されないのはなぜですか?
- 3. NameError:初期化されていない定数 - ActiveRecordで許可されていない構文ですか?
- 4. Cでは、なぜ0に初期化された変数は "nm"で初期化されていないと報告されますか?
- 5. forループ内でこの重要でない変数が初期化されるのはなぜですか?
- 6. C++:初期化されていない変数出力はXcodeで0です
- 7. クラス内の初期化されていない定数メンバ
- 8. JavaのTreeMapで初期サイズが許可されないのはなぜですか?
- 9. 私のextern変数がまだ初期化されていないのはなぜですか?
- 10. このBackboneビューが初期化されないのはなぜですか?
- 11. なぜ初期化されていないローカル変数にブレークポイントを設定できないのですか?
- 12. グローバル変数が新しいスレッドで初期化されない
- 13. Checkstyleで保護された変数がデフォルトで許可されないのはなぜですか?
- 14. C#:バイト配列で初期化できないのはなぜですか?
- 15. このデフォルトのテンプレートパラメータは許可されないのはなぜですか?
- 16. なぜC++でテンプレートのオーバーロードが許可されないのですか?
- 17. 「初期化されていない定数Feed :: Feedzirra」エラーが表示されるのはなぜですか?
- 18. 初期化されていないグローバル変数はどこで初期化されますか?
- 19. 静的変数をリテラルでない値で初期化できないのはなぜですか?
- 20. なぜcatchブロックはJavaで初期化されていない変数でエラーを出しますか?
- 21. TensorFlowでは、初期化されていない変数を初期化する方法はありますか? TensorFlowで変数を初期化する
- 22. なぜローカルconst変数をポインタキャストで変更できますか?Cでグローバルconst変数を変更できないのはなぜですか?
- 23. Date.newが初期化を呼び出さないのはなぜですか?
- 24. WCFでメソッドオーバーロードが許可されないのはなぜですか?
- 25. Visual Studio 2010でデバッグモードが許可されないのはなぜですか?
- 26. "use"バインディングでパターンが許可されないのはなぜですか?
- 27. 初期化されていない参照変数がヌルでない場合はどうですか?
- 28. 注釈メンバとしてインターフェイスが許可されないのはなぜですか?
- 29. 変数が初期化されていない可能性があります
- 30. スタイリングテーブルの列が許可されないのはなぜですか?
あなたが言う整数が、定義しているタイプのすべてのオブジェクトに共通でない限り、メンバ変数にはどのような値を割り当てられていますか?その変数static constを呼び出すことは、変数がその型のすべてのオブジェクトに共通であることをコンパイラに伝える方法です。 – vpit3833
私はコンストラクタの初期化を避け、メンバー変数にデフォルト値を与えようとしています。 – Sulla
http://stackoverflow.com/questions/370283/why-cant-i-have-a-non-integral-static-const-member-in-a-classおよびhttp://stackoverflow.com/questions/を参照してください。 3575580/rationale-behind-static-const-member-initialization-syntaxを参考にしてください。 – sje397