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

Linda Hamilton
リリース: 2024-10-29 04:41:02
オリジナル
647 人が閲覧しました

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

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

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!