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

C 演算子の右側でイニシャライザ リストを使用できないのはなぜですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-12-09 01:19:13702ブラウズ

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

RHS の演算子のオーバーロードと初期化子リスト

C プログラミングでは、初期化子リストは、式のリストを使用して集合オブジェクトを初期化するための簡潔な構文です。 。イニシャライザ リストはさまざまなシナリオで便利に使用できますが、演算子の右側 (RHS) でのイニシャライザ リストの使用法が議論のポイントとなっています。

イニシャライザ リストが RHS で制限されている理由

C 11 では、二項演算子 << を含む演算子の RHS に初期化子リストを使用できません。コードで使用されます。この制限にはいくつかの理由があります:

  • 初期化子リストは式ではありません: C 標準によれば、初期化子リストは式とみなされません。通常、二項演算子の引数は式であり、式に定義された文法では初期化子リストは除外されます。
  • パーサーの課題: 演算子の左側 (LHS) で初期化子リストを許可すると、文法的な課題が生じます。 。 LHS と RHS の両方の位置で初期化子リストを許可すると、式の標準文法があいまいになる可能性があります。

初期化子リストの例外

に関する一般的な制限にもかかわらず、演算子の引数でイニシャライザ リストを使用する場合、C はイニシャライザ リストが存在する特定の例外を定義します。受け入れられます:

  • 関数の引数として
  • 配列アクセス式の添え字として
  • コンストラクターの引数として
  • return ステートメント内
  • 変数定義の初期化子として

コード内では、 << 内で呼び出される bar コンストラクターへの引数として初期化子リストを使用できます。演算子:

foo baz;
baz << bar{1, -2, "foo", 4, 5}; // Legal

制限の理由

演算子の RHS で初期化子リストを制限する決定は、一貫性のある明確な文法を維持したいという要望から生じています。すべてのコンテキストでイニシャライザ リストを許可すると、言語にさらなる複雑さと潜在的なあいまいさが生じます。

質問で言及されたディスカッション ペーパーに記載されているように、RHS ではイニシャライザ リストを許可するが、LHS では許可しないという代替案が検討されました。問題が多すぎる。したがって、特定のコンテキストでのみ初期化リストを許可するという保守的なアプローチが選択されました。

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

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