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

Barbara Streisand
リリース: 2024-11-07 07:30:03
オリジナル
505 人が閲覧しました

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 サイトの他の関連記事を参照してください。

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