ホームページ >バックエンド開発 >C++ >C の演算子の右側で初期化子リストを使用できないのはなぜですか?

C の演算子の右側で初期化子リストを使用できないのはなぜですか?

Barbara Streisand
Barbara Streisandオリジナル
2024-12-13 21:17:12426ブラウズ

Why Can't I Use Initializer Lists on the Right-Hand Side of Operators in C  ?

初期化リストと演算子の右側

次のコード スニペットを考えてみましょう:

class foo { };

struct bar
{
    template<typename... T>
    bar(T const&amp;...) { }
};

foo&amp; operator<<(foo&amp; f, bar const&amp;) { return f; }

int main()
{
    foo baz;
    baz << {1, -2, "foo", 4, 5};

    return 0;
}

コンパイラー演算子の右側 (RHS) での初期化子リストの使用について不満を言う<<。これにより、初期化子リストが関数の引数で使用される場合とは対照的に、なぜこれが C で許可されないのかという疑問が生じます。

初期化子リストと式

初期化子リストは使用できません。 C 標準で定義されている式。関数と演算子の引数は通常、式である必要があります。ただし、標準では、関数の引数、添字、代入式など、特定のコンテキストにおける初期化子リストの例外が定義されています。

二項演算子の例外はありません

はありません二項演算子の右側(または左側)で使用される初期化子リストの例外です。この禁止事項は、初期化子リストを式として許可するときに発生する解析の問題に起因します。初期化子リストとブロックの両方に中括弧を使用すると、文法が曖昧になります。

制限の根拠

初期化子リストの使用を式に拡張する提案ただし、初期化子リストを二項演算子の右側のオペランドとして許可することは許可するが、許可しないことが決定されました。

結論

初期化子リストは式として定義されていないため、演算子の右側では使用できません。スタンダードでは。特定のコンテキストでの使用には特定の例外が存在しますが、これらを一般的な演算子の引数として許可すると、初期化子リストとブロックの両方で中かっこが使用されるため、解析に重大な課題が生じる可能性があります。

以上がC の演算子の右側で初期化子リストを使用できないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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