初期化リストでの std::array の使用: 構文の謎の解決
C データ構造の領域では、std::array は次のとおりです。固定サイズのメモリ割り当てで出力されます。その汎用性により初期化リストを使用した初期化が可能ですが、いくつかの予期せぬ問題が発生する可能性があります。
構文エニグマ
クエリによると、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 の機能についての誤解なのか、それとも GNU 標準 C ライブラリ実装の欠陥なのかという疑問を引き起こします。
解決策の公開
背後にあるものシーンでは、std::array は構造体として構築されます:
<code class="cpp">template<typename T, int size> struct std::array { T a[size]; };</code>
この構造体は配列をカプセル化しますが、興味深いことに、初期化子リストを受け入れるコンストラクターがありません。それにもかかわらず、C 11 では std::array が集合体として認定されるため、集合体の初期化が代替アプローチになります。
集合体の初期化を実行するには、構造体内の配列をターゲットにするために追加の中括弧のセットが必要です:
<code class="cpp">std::array<std::string, 2> strings = {{ "a", "b" }};</code>
コンパイラの異常
C 標準では、上記の例の追加の中括弧は不要であると示唆されています。ただし、発生したコンパイラ エラーは、集約の初期化を認識できない、GCC 実装の潜在的なバグを示唆しています。
結論
この問題は最初は複雑に見えるかもしれませんが、一見してわかるように、鍵は std::array の基礎となる構造と集合体の初期化の複雑さを理解することにあります。二重中括弧構文はコンパイル エラーを解決し、C 標準で意図されているように、初期化子リストを使用して std::array を作成できるようにします。
以上が初期化リストを使用して std::array を初期化するとコンパイル エラーが発生するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。