ホームページ > バックエンド開発 > C++ > std::array では初期化リストに二重中括弧が必要ですが、std::vector では必要ないのはなぜですか?

std::array では初期化リストに二重中括弧が必要ですが、std::vector では必要ないのはなぜですか?

Mary-Kate Olsen
リリース: 2024-11-07 03:40:03
オリジナル
830 人が閲覧しました

Why does std::array require double curly braces for initializer lists while std::vector doesn't?

std::vector と std::array の C Initializer_List の動作の不一致

C コンテナーの初期化リストを使用する場合、std::vector と std::array の間に複雑な違いが生じます。 std::配列。この動作の背後にある理由を調べてみましょう。

問題:

次のコードを考えてみましょう:

std::vector<int> x{1,2,3,4};
std::array<int, 4> y{{1,2,3,4}};
ログイン後にコピー

Double Curly を使用する必要があるのはなぜですかstd::array には中括弧がありますが、std::vector には中括弧はありません?

答え:

この動作は std::array の性質から生じています。集合体として。集約には、初期化子リストを受け入れるコンストラクターなど、ユーザーが宣言したコンストラクターがありません。したがって、 std::array の集約初期化は、= 構文を使用した「古いスタイル」の初期化によって実行されます:

std::array<int, 4> y = { { 1, 2, 3, 4 } };
ログイン後にコピー

この古いスタイルでは、余分な中括弧が省略される可能性があり、結果として同等のコードが生成されます。

std::array<int, 4> y = { 1, 2, 3, 4 };
ログイン後にコピー

ただし、この中括弧の省略は、= 構文を使用した古いスタイルの初期化を使用する場合にのみ許可されます。 = 構文を使用しない直接リストの初期化では、中括弧の省略は許可されません。この制限は C 11 §8.5.1/11 によって管理されます。

提案された解決策:

これに対処するために欠陥レポート (CWG 欠陥 #1270) が作成されました。制限。提案された解決策が採用された場合、次のものを含むすべての形式のリスト初期化で中括弧の省略が許可されます:

std::array<int, 4> y{ 1, 2, 3, 4 };
ログイン後にコピー

この変更により、std::vector と std::array の動作に一貫性がもたらされます。初期化子リストを使用する場合。

以上がstd::array では初期化リストに二重中括弧が必要ですが、std::vector では必要ないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート