初期化リストと std::array: GCC のバグ
C 標準ライブラリの std::array クラスは、修正済みのサイズの配列コンテナー。このクラスは初期化リストをサポートしていると一般に信じられています。
しかし、GCC 4.6.1 を使用すると、次の構文を使用して std::array インスタンスを初期化しようとすると失敗します:
<code class="cpp">std::array<std::string, 2> strings = { "a", "b" }; std::array<std::string, 2> strings({ "a", "b" });</code>
初期化リストにもかかわらずstd::vector を使用する場合、std::array でのこの動作は、C 標準または潜在的な GCC 問題に関する疑問を引き起こします。
std::array の内部動作
std::array は本質的に配列をカプセル化する構造体です。その構造は次のようになります。
<code class="cpp">template<typename T, int size> struct std::array { T a[size]; };</code>
初期化子リストを受け入れるコンストラクターがある std::vector とは異なり、std::array にはそのようなコンストラクターがありません。
集約初期化
std::array には初期化リストの明示的なコンストラクターがありませんが、C 11 では集合体型とみなされます。そのため、集合体を初期化できます。ただし、構造体内の配列を初期化するには、追加の中括弧のセットが必要です。
<code class="cpp">std::array<std::string, 2> strings = {{ "a", "b" }};</code>
潜在的な GCC バグ
C 標準では、以下の省略が許可されています。このような初期化における余分な中括弧。したがって、GCC がこれらを使用しないとこの構文を処理できないのはバグである可能性があります。
以上がGCC が初期化リストを使用した std::array の初期化に失敗するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。