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