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

0 投票する
3 に答える
131 参照

c++ - これは集約の初期化ですか、それとも C++ のデフォルトの初期化ですか?

次のプログラムを検討してください。

集約初期化またはデフォルト初期化を使用していますか? 私は混乱しています。

0 投票する
3 に答える
2117 参照

c++ - {} から通常の配列を初期化できるのに、std::array では初期化できないのはなぜですか

これは機能します:

のすべての要素はarr、値がゼロに初期化されます。

これが機能しない理由:

g++ (バージョン 4.8.2) から次の警告が表示されます。

警告: メンバ 'std::array<int, 10ul>::_M_elems' の初期化子がありません</p>

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

c++ - std::array<> の初期化

次のコードを検討してください。

gcc でコンパイル:

NB1: 最初の初期化ステートメントをコメントアウトすると、コードはエラーなしでコンパイルされます。
NB2: すべての初期化をコンストラクター呼び出しに変換すると、同じ結果が得られます。
NB3: MSVC2015 は同じように動作します。

最初の初期化がコンパイルに失敗する理由と、2 番目と 3 番目の初期化が問題ない理由がわかります。(例: C++11: 正しい std::array の初期化?を参照してください。)

私の質問は次のとおりです。最終的な初期化がコンパイルされるのはなぜですか?

0 投票する
3 に答える
219 参照

c++ - この C++ C11 構文は何ですか: "= {}"?

C++ファイルでこの構文に出くわしました:

それは何をするためのものか?デフォルトのコンストラクターを呼び出すだけですか?

0 投票する
3 に答える
10819 参照

c++ - デフォルトのコンストラクタを削除しました。オブジェクトはまだ作成できます...時々

素朴で楽観的で、ああ.. C++ 11の統一された初期化構文の間違った見方

C++11 のユーザー定義型オブジェクトは{...}、古い構文ではなく新しい構文で構築する必要があるため、コンストラクターのオーバーロードと同様のパラメーター(...)を除きます (例: size ctor と 1 elem init_list ctor の比較)。std::initializer_liststd::vector

利点は次のとおりです。狭い暗黙の変換がなく、最も厄介な解析である一貫性 (?) に問題がありません。同じだと思っていたので問題はありませんでした(例を除いて)。

しかし、そうではありません。

純粋な狂気の物語

{}、既定のコンストラクターを呼び出します。

... 次の場合を除きます。

  • デフォルトのコンストラクターが削除され、
  • 他のコンストラクターは定義されていません。

では、むしろオブジェクトを値初期化するように見えますか?...オブジェクトがデフォルトのコンストラクターを削除した場合でも、オブジェクト{}を作成できます。これは、削除されたコンストラクターの目的全体に勝っていませんか?

...次の場合を除く:

  • オブジェクトには削除されたデフォルト コンストラクタがあり、
  • 他のコンストラクターが定義されています。

その後、 で失敗しcall to deleted constructorます。

...次の場合を除く:

  • オブジェクトには削除されたコンストラクターがあり、
  • 他のコンストラクターが定義されておらず、
  • 少なくとも非静的データ メンバー。

その後、フィールド初期化子が欠落して失敗します。

{value}ただし、オブジェクトを構築するために使用できます。

これは最初の例外と同じかもしれません (値はオブジェクトに初期化されます)

...次の場合を除く:

  • クラスには削除されたコンストラクターがあります
  • クラス内のデフォルトで初期化された少なくとも 1 つのデータ メンバー。

次に、オブジェクトを作成すること{}もできません。{value}

私はいくつかを逃したと確信しています。皮肉なことに、それは統一初期化構文と呼ばれています。繰り返しますが、UNIFORM初期化構文です。

この狂気は何ですか?

シナリオA

削除されたデフォルト コンストラクタ:

シナリオB

デフォルトのコンストラクターを削除し、他のコンストラクターを削除しました

シナリオC

デフォルトのコンストラクターを削除し、他のコンストラクターを定義

シナリオD

既定のコンストラクターが削除され、他のコンストラクターは定義されておらず、データ メンバー

シナリオ E

デフォルト コンストラクターの削除、T コンストラクターの削除、T データ メンバーの削除

シナリオ F

デフォルト コンストラクター、クラス内データ メンバー初期化子を削除

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

c++ - コピー不可能なメンバーを持つクラスの集約初期化

コピーコンストラクターが削除されたクラスがあるとします。

このクラスを別のクラスで使用します。

しかし、集計の初期化を使用しようとすると

コンパイラは次のエラーを出力します。

集約の初期化にクラスのメンバーのコピー コンストラクターが必要なのはなぜですか? 集計の初期化は、コピー コンストラクターを使用してすべてのメンバーを初期化しますか?