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

`std::array` では初期化に二重中括弧が必要なのに対し、`std::vector` では単一の中括弧のみが必要なのはなぜですか?

Barbara Streisand
Barbara Streisandオリジナル
2024-11-07 07:30:03515ブラウズ

Why Does `std::array` Require Double Curly Braces for Initialization, While `std::vector` Only Needs Single Curly Braces?

Initializer List の動作の std::vector と std::array の違い

C では、 std::vector と std::array のInitializer_list の動作std::array は大きく異なります。次のコード スニペットを考えてみましょう:

std::vector<int> x{1,2,3,4};
std::array<int, 4> y{{1,2,3,4}};

std::vector には 1 つの中括弧のみが必要なのに対し、std::array には二重の中括弧が必要なのはなぜですか?

説明

std::vector には、引数として std::initializer_list を取るユーザー定義のコンストラクターがあります。これにより、単一の中括弧を使用した直接リストの初期化が可能になります。

一方、 std::array は、ユーザー定義のコンストラクターを持たない集約型です。代わりに、C から継承された機能である集約初期化を使用します。集約初期化では、二重中括弧を使用した初期化が可能です。

中括弧と = 記号を使用した集約初期化の古い構文も有効です。

std::array<int, 4> y = { { 1, 2, 3, 4 } };

ただし、この構文では、特定の場合に中括弧の省略が許可されますが、std::array を使用した直接リストの初期化では許可されません。 C 標準 (C 11 §8.5.1/11) の脚注には、「リスト初期化の他の用途では中括弧を省略することはできません。」

欠陥レポートと解決案

この制限に対処するために、欠陥レポート (CWG 欠陥 #1270) が提出されました。提案された解決策が採用された場合、 std::array の直接リストの初期化で中括弧の省略が許可され、次が有効になります:

std::array<int, 4> y{ 1, 2, 3, 4 };

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

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。