「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > GCC が初期化リストを使用した std::array の初期化に失敗するのはなぜですか?

GCC が初期化リストを使用した std::array の初期化に失敗するのはなぜですか?

2024 年 11 月 19 日に公開
ブラウズ:434

Why Does GCC Fail to Initialize std::array with Initialization Lists?

初期化リストと std::array: GCC のバグ

C 標準ライブラリの std::array クラスは、修正済みのサイズの配列コンテナー。このクラスは初期化リストをサポートしていると一般的に考えられています。

ただし、GCC 4.6.1 を使用すると、次の構文を使用して std::array インスタンスを初期化しようとすると失敗します:

std::array<:string> strings = { "a", "b" };
std::array<:string> strings({ "a", "b" });

初期化リストは std::vector で動作するにもかかわらず、std::array でこの動作が発生しました。 C 標準または潜在的な GCC の問題に関する質問。

std::array の内部Workings

std::array は本質的に配列をカプセル化する構造体です。その構造は次のようになります:

template
struct std::array {
  T a[size];
};

初期化子リストを受け入れるコンストラクターがある std::vector とは異なり、std::array にはそのようなコンストラクターがありません。

集約初期化

std::array には初期化リストの明示的なコンストラクターがありませんが、C では集約型とみなされます。 11. したがって、集合体の初期化が可能です。ただし、構造体内の配列を初期化するには、追加の中括弧のセットが必要です:

std::array<:string> strings = {{ "a", "b" }};

潜在的な GCC バグ

C 標準では、このような初期化では余分な中括弧が使用されます。したがって、これらがないと GCC がこの構文を処理できないのはバグである可能性があります。

最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3