問題タブ [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.

0 投票する
0 に答える
247 参照

c++ - 同じ名前の変数を持つコンストラクターのメンバー初期化子リスト

この例では:

私のコンパイラはx(x)、 の内側xが引数で、外側xがメンバー変数であることを、 を書かなくても理解できますthis->

この動作は標準的なものですか?

0 投票する
0 に答える
55 参照

c++ - コンストラクターではなく、クラス関数でオブジェクトを初期化することは可能ですか?

クラス関数でメンバー オブジェクトを初期化する方法があるかどうかを調べています。つまり、メンバー初期化子リストを使用したくないということです。

私はほしくない:Foo::Foo(): bar(), barBar(){}

しかし欲しい:Foo::setup(){bar(); barBar() }

ここで私を助けてくれることを願っています。

0 投票する
1 に答える
503 参照

c++ - デフォルトの初期化子 gcc と clang でラムダを使用する

トランクからの場合は正常に動作しますclang++が、g++トランクからの場合はエラー メッセージ ( link )で失敗します。

エラー: 'this' は、このラムダ関数に対してキャプチャされませんでした

point_of_cone名前空間スコープでの定義は、両方で正常に機能します。

ラムダ キャプチャを使用してわずかに変更された定義[this]は、グローバル スコープまたはローカル スコープの両方でも正常に機能します。

どのコンパイラが正しいですか?

0 投票する
1 に答える
82 参照

c++ - gcc でブレース初期化子を使用してメンバー std::array を初期化する際のエラー

次の例を検討してください。

g++ 4.6.3 でコンパイルしようとすると、次の-std=c++0xエラーが発生します。

ただし、変数を定義するときは、同じブレースの初期化が機能します。

この特定のバージョンの gcc が C++11 を完全に実装していないためですか、それとも何か不足していて最初の例が正しくないためですか?

0 投票する
2 に答える
795 参照

c++ - C++ - デフォルトのメンバー初期化子とメンバー初期化リストを混在させる - 悪い考えですか?

これは、スタイルの問題でもあり、正しさの問題でもあります。次のサンプル (埋め込みヘッダーを含むデータのブロックを処理するクラスのストリップダウン) を送信します。

まず、技術的な正しさ... 書かれているとおりで、最初に初期化scratch_され、次に? (アイテムはコンパイル時のリテラル定数であり、初期化順序を考慮しません。)また、初期化子の宣言方法が、デフォルトのメンバー初期化( )またはメンバー初期化子リストであっても、初期化順序に影響を与えないことも正しいですか?しかし、むしろ、メンバーが宣言される順序だけが重要なのでしょうか? 初期化順序に関するISO仕様を引用して、この回答を見つけました。私が集めたのは、それは重要ではないということです。size_header_data_length_constexprint foo = 5scratch_size_デフォルトのメンバー初期化子が与えられている他のメンバーと比較して、メンバー初期化リストに表示されます。scratch_およびsize_が他のメンバーの前に宣言されていることだけが重要です。おそらくscratch_andsize_が最後に宣言された場合、 header_anddata_length_は (望ましくない/間違って) 最初に初期化されます。

スタイルの質問...これら 2 つの初期化スタイルを混在させるのは悪いスタイルですか? 私のアプローチは、メンバー初期化リスト ( scratch_size_) の項目はコンストラクターに渡される引数に依存し、残りのクラス メンバーは他のクラス メンバーから派生するというものです。明らかに、イニシャライザがコンストラクタ引数に依存している場合はメンバ初期化リストに入る必要があります。すべての初期化子をメンバー初期化リストに入れ、デフォルトのメンバー初期化子を放棄する必要がありますか? IMO、それにより、コードを追跡するのが少し難しくなる可能性があります。考え?

0 投票する
2 に答える
1270 参照

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 が「初期化子を持つ」と見なされる場合とそうでない場合がある理由です。