ホームページ >バックエンド開発 >C++ >初期化リストを使用して std::array を初期化すると、GCC 4.6.1 でコンパイル エラーが発生するのはなぜですか?

初期化リストを使用して std::array を初期化すると、GCC 4.6.1 でコンパイル エラーが発生するのはなぜですか?

DDD
DDDオリジナル
2024-10-29 09:51:30582ブラウズ

Why Does Initializing std::array with an Initialization List Cause a Compilation Error in GCC 4.6.1?

初期化リストでの std::array の使用: コンパイラの難問

std::array で初期化リストを使用するための構文は次のように見えるかもしれません簡単に言えば、一部のユーザーはこれを実装しようとしたときに困難に遭遇しました。質問に示されている例:

<code class="cpp">std::array<std::string, 2> strings = { "a", "b" };</code>

は、カンマの前に予期しないトークンがあるため、GCC 4.6.1 ではコンパイル エラーが発生します。初期化リストを問題なく受け入れる std::vector の動作とのこの矛盾により、構文の有効性に関する混乱と憶測が生じています。

std::array の性質の詳細 🎜>

この矛盾を理解するには、std::array:

<code class="cpp">template<typename T, int size>
struct std::array
{
  T a[size];
};</code>

の定義を調べることが不可欠です。この定義から明らかなように、std::array は本質的に次のような構造体です。配列を囲みます。初期化リストを直接受け入れるコンストラクターがありません。ただし、C 11 の規則によれば、std::array は集合体とみなされます。これにより、配列の要素を間接的に初期化する集合体の初期化が可能になります。

構文の謎を克服する

集合体の初期化を使用して std::array を正常に初期化するには、次のようにします。追加の中括弧のセットが必要です:

<code class="cpp">std::array<std::string, 2> strings = {{ "a", "b" }};</code>

中括弧をネストすることにより、コンパイラーは構造体内の配列要素を初期化する意図を認識します。これにより、最初の例で発生したコンパイル エラーが解消されます。

GCC のバグか標準の不規則性?

興味深いことに、C 標準では、この例では余分な中括弧を省略できることが暗示されています。具体的なケース。したがって、GCC 4.6.1 には、簡略化された構文の適切な解釈を妨げるバグが発生している可能性があります。

以上が初期化リストを使用して std::array を初期化すると、GCC 4.6.1 でコンパイル エラーが発生するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。