問題タブ [aggregate-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++ - これは集約の初期化ですか、それとも C++ のデフォルトの初期化ですか?
次のプログラムを検討してください。
集約初期化またはデフォルト初期化を使用していますか? 私は混乱しています。
c++ - {} から通常の配列を初期化できるのに、std::array では初期化できないのはなぜですか
これは機能します:
のすべての要素はarr
、値がゼロに初期化されます。
これが機能しない理由:
g++ (バージョン 4.8.2) から次の警告が表示されます。
警告: メンバ 'std::array<int, 10ul>::_M_elems' の初期化子がありません</p>
c++ - std::array<> の初期化
次のコードを検討してください。
gcc でコンパイル:
NB1: 最初の初期化ステートメントをコメントアウトすると、コードはエラーなしでコンパイルされます。
NB2: すべての初期化をコンストラクター呼び出しに変換すると、同じ結果が得られます。
NB3: MSVC2015 は同じように動作します。
最初の初期化がコンパイルに失敗する理由と、2 番目と 3 番目の初期化が問題ない理由がわかります。(例: C++11: 正しい std::array の初期化?を参照してください。)
私の質問は次のとおりです。最終的な初期化がコンパイルされるのはなぜですか?
c++ - この C++ C11 構文は何ですか: "= {}"?
C++ファイルでこの構文に出くわしました:
それは何をするためのものか?デフォルトのコンストラクターを呼び出すだけですか?
c++ - デフォルトのコンストラクタを削除しました。オブジェクトはまだ作成できます...時々
素朴で楽観的で、ああ.. C++ 11の統一された初期化構文の間違った見方
C++11 のユーザー定義型オブジェクトは{...}
、古い構文ではなく新しい構文で構築する必要があるため、コンストラクターのオーバーロードと同様のパラメーター(...)
を除きます (例: size ctor と 1 elem init_list ctor の比較)。std::initializer_list
std::vector
利点は次のとおりです。狭い暗黙の変換がなく、最も厄介な解析である一貫性 (?) に問題がありません。同じだと思っていたので問題はありませんでした(例を除いて)。
しかし、そうではありません。
純粋な狂気の物語
は{}
、既定のコンストラクターを呼び出します。
... 次の場合を除きます。
- デフォルトのコンストラクターが削除され、
- 他のコンストラクターは定義されていません。
では、むしろオブジェクトを値初期化するように見えますか?...オブジェクトがデフォルトのコンストラクターを削除した場合でも、オブジェクト{}
を作成できます。これは、削除されたコンストラクターの目的全体に勝っていませんか?
...次の場合を除く:
- オブジェクトには削除されたデフォルト コンストラクタがあり、
- 他のコンストラクターが定義されています。
その後、 で失敗しcall to deleted constructor
ます。
...次の場合を除く:
- オブジェクトには削除されたコンストラクターがあり、
- 他のコンストラクターが定義されておらず、
- 少なくとも非静的データ メンバー。
その後、フィールド初期化子が欠落して失敗します。
{value}
ただし、オブジェクトを構築するために使用できます。
これは最初の例外と同じかもしれません (値はオブジェクトに初期化されます)
...次の場合を除く:
- クラスには削除されたコンストラクターがあります
- クラス内のデフォルトで初期化された少なくとも 1 つのデータ メンバー。
次に、オブジェクトを作成すること{}
もできません。{value}
私はいくつかを逃したと確信しています。皮肉なことに、それは統一初期化構文と呼ばれています。繰り返しますが、UNIFORM初期化構文です。
この狂気は何ですか?
シナリオA
削除されたデフォルト コンストラクタ:
シナリオB
デフォルトのコンストラクターを削除し、他のコンストラクターを削除しました
シナリオC
デフォルトのコンストラクターを削除し、他のコンストラクターを定義
シナリオD
既定のコンストラクターが削除され、他のコンストラクターは定義されておらず、データ メンバー
シナリオ E
デフォルト コンストラクターの削除、T コンストラクターの削除、T データ メンバーの削除
シナリオ F
デフォルト コンストラクター、クラス内データ メンバー初期化子を削除
c++ - コピー不可能なメンバーを持つクラスの集約初期化
コピーコンストラクターが削除されたクラスがあるとします。
このクラスを別のクラスで使用します。
しかし、集計の初期化を使用しようとすると
コンパイラは次のエラーを出力します。
集約の初期化にクラスのメンバーのコピー コンストラクターが必要なのはなぜですか? 集計の初期化は、コピー コンストラクターを使用してすべてのメンバーを初期化しますか?