問題タブ [member-initialization]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - 同じ名前の変数を持つコンストラクターのメンバー初期化子リスト
この例では:
私のコンパイラはx(x)
、 の内側x
が引数で、外側x
がメンバー変数であることを、 を書かなくても理解できますthis->
。
この動作は標準的なものですか?
c++ - コンストラクターではなく、クラス関数でオブジェクトを初期化することは可能ですか?
クラス関数でメンバー オブジェクトを初期化する方法があるかどうかを調べています。つまり、メンバー初期化子リストを使用したくないということです。
私はほしくない:Foo::Foo(): bar(), barBar(){}
しかし欲しい:Foo::setup(){bar(); barBar() }
ここで私を助けてくれることを願っています。
c++ - デフォルトの初期化子 gcc と clang でラムダを使用する
トランクからの場合は正常に動作しますclang++
が、g++
トランクからの場合はエラー メッセージ ( link )で失敗します。
エラー: 'this' は、このラムダ関数に対してキャプチャされませんでした
point_of_cone
名前空間スコープでの定義は、両方で正常に機能します。
ラムダ キャプチャを使用してわずかに変更された定義[this]
は、グローバル スコープまたはローカル スコープの両方でも正常に機能します。
どのコンパイラが正しいですか?
c++ - gcc でブレース初期化子を使用してメンバー std::array を初期化する際のエラー
次の例を検討してください。
g++ 4.6.3 でコンパイルしようとすると、次の-std=c++0x
エラーが発生します。
ただし、変数を定義するときは、同じブレースの初期化が機能します。
この特定のバージョンの gcc が C++11 を完全に実装していないためですか、それとも何か不足していて最初の例が正しくないためですか?
c++ - C++ - デフォルトのメンバー初期化子とメンバー初期化リストを混在させる - 悪い考えですか?
これは、スタイルの問題でもあり、正しさの問題でもあります。次のサンプル (埋め込みヘッダーを含むデータのブロックを処理するクラスのストリップダウン) を送信します。
まず、技術的な正しさ... 書かれているとおりで、最初に初期化scratch_
され、次に? (アイテムはコンパイル時のリテラル定数であり、初期化順序を考慮しません。)また、初期化子の宣言方法が、デフォルトのメンバー初期化( )またはメンバー初期化子リストであっても、初期化順序に影響を与えないことも正しいですか?しかし、むしろ、メンバーが宣言される順序だけが重要なのでしょうか? 初期化順序に関するISO仕様を引用して、この回答を見つけました。私が集めたのは、それは重要ではないということです。size_
header_
data_length_
constexpr
int foo = 5
scratch_
size_
デフォルトのメンバー初期化子が与えられている他のメンバーと比較して、メンバー初期化リストに表示されます。scratch_
およびsize_
が他のメンバーの前に宣言されていることだけが重要です。おそらくscratch_
andsize_
が最後に宣言された場合、 header_
anddata_length_
は (望ましくない/間違って) 最初に初期化されます。
スタイルの質問...これら 2 つの初期化スタイルを混在させるのは悪いスタイルですか? 私のアプローチは、メンバー初期化リスト ( scratch_
、size_
) の項目はコンストラクターに渡される引数に依存し、残りのクラス メンバーは他のクラス メンバーから派生するというものです。明らかに、イニシャライザがコンストラクタ引数に依存している場合は、メンバ初期化リストに入る必要があります。すべての初期化子をメンバー初期化リストに入れ、デフォルトのメンバー初期化子を放棄する必要がありますか? IMO、それにより、コードを追跡するのが少し難しくなる可能性があります。考え?
c++ - C++14 での集合メンバーの初期化
この構造を持つ:
そして次のように宣言します。
Clang (3.8.0) と GCC (5.4.0) の両方によると、これらは 8 つの可能な組み合わせの値です (a.b1.e と a.b2.a は繰り返されるケースです)。から(またはそうでない)、:
N3605および C++14 標準 (ISO/IEC 14882:2014) のセクション 8.5.1、パラグラフ 7の例を考慮に入れます。
集約内のメンバーよりもリスト内の初期化句の数が少ない場合、明示的に初期化されていない各メンバーは、brace-or-equal-initializer から初期化されるか、brace-or-equal-initializerがない場合、空のイニシャライザ リスト (8.5.4) から。
ケース010が正しいと思います。では、なぜケース 011 (a.b2.c) と 001 (a.b2.e) もゼロに等しくないのでしょうか? a.b2 には「初期化子がある」ため、ケース 010 はゼロです。したがって、「非静的データ メンバー初期化子は無視されます」( N3605再び)。デフォルトのメンバー初期化子も無視されないのはなぜですか?
実際、C++14 標準の引用を読むと、ケース 010 は 12 (ゼロ) であり、ケース 011 と 001 はゼロ (実際にはそうです) であることがより理にかなっています。だから私が理解していないのは、 a.b2 が「初期化子を持つ」と見なされる場合とそうでない場合がある理由です。