[解決済み] std::vector と std::array の C++ initializer_list の動作はなぜ違うのですか?
2023-06-26 18:43:29
質問
コードを入力してください。
std::vector<int> x{1,2,3,4};
std::array<int, 4> y{{1,2,3,4}};
なぜstd::arrayには二重中括弧が必要なのですか?
どのように解決するのですか?
std::array<T, N>
は集合体です: これはユーザが宣言したコンストラクタを持ちません。
std::initializer_list
. 中括弧を使った初期化は
集合的初期化
というC++の機能を継承しています.
凝集体初期化の "古いスタイル" では、凝集体初期化のために
=
:
std::array<int, 4> y = { { 1, 2, 3, 4 } };
この古いスタイルの集合体初期化では、余分な中括弧は省略されることがあるので、これは次のように等価である。
std::array<int, 4> y = { 1, 2, 3, 4 };
しかし、これらの余分な中括弧は、以下の形式の宣言においてのみ省略することができます。
T x = { a };
(C++11 §8.5.1/11) つまり、旧スタイルの
=
が使用される場合です。 中括弧の削除を許可するこのルールは、リストの直接初期化には適用されません。 この脚注には、「リスト初期化の他の用途では、中括弧を省略することはできません」と書かれています。
この制限に関する不具合報告があります。 CWG defect #1270 . 提案された解決策が採用されると、他の形式のリスト初期化でも brace elision が許可され、以下のように整形されるようになります。
std::array<int, 4> y{ 1, 2, 3, 4 };
(この不具合報告を見つけたVille Voutilainenに脱帽)
関連
-
[解決済み] string does not name a type Errorが発生するのはなぜですか?
-
[解決済み】C++の変数はイニシャライザーを持っているが、不完全な型?
-
[解決済み】#include<iostream>は存在するのですが、「識別子 "cout "は未定義です」というエラーが出ます。なぜですか?
-
[解決済み] 要素ごとの加算は、結合ループよりも分離ループの方がはるかに高速なのはなぜですか?
-
[解決済み] template "と "typename "キーワードはどこに、なぜ入れなければならないのですか?
-
[解決済み] Collatz予想の検証を行うC++のコードは、なぜ手書きのアセンブリよりも高速に動作するのでしょうか?
-
[解決済み] std::vectorをハードコードされた要素で初期化する最も簡単な方法は何ですか?
-
[解決済み] std::vector<> からインデックスで要素を消すにはどうしたらいいですか?
-
[解決済み] error: 'this' 引数に xxx を渡すと修飾子が消える
-
[解決済み】std::mapからすべてのキー(または値)を取得し、それらをベクトルに入れるには?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】識別子 "string "は未定義?
-
[解決済み】C-stringを使用すると警告が表示される。"ローカル変数に関連するスタックメモリのアドレスが返される"
-
[解決済み】C++のGetlineの問題(オーバーロードされた関数 "getline "のインスタンスがない
-
[解決済み】抽象クラス型の無効なnew-expression
-
[解決済み】Cygwin Make bash コマンドが見つかりません。
-
[解決済み】IntelliSense:オブジェクトに、メンバー関数と互換性のない型修飾子がある
-
[解決済み】「std::operator」で「operator<<」にマッチするものがない。
-
[解決済み】Visual Studio 2013および2015でC++コンパイラーエラーC2280「削除された関数を参照しようとした」が発生する
-
[解決済み] 式はクラス型を持つ必要があります。
-
[解決済み】エラー。引数リストに一致するコンストラクタのインスタンスがない