演算子 += の右側に初期化リストを使用できるのに、演算子 + では使用できないのはなぜですか? 質問する

演算子 += の右側に初期化リストを使用できるのに、演算子 + では使用できないのはなぜですか? 質問する

これは、以前、なぜ括弧で囲まれた初期化子を引数として使用できないのかという質問がありました。operator+、これは、この件に関する以前の質問

次のC++コードを考えてみましょう。ideone.comでライブをお試しください:

#include <iostream>
#include <initializer_list>
using namespace std;

struct AddInitializerList {
    void operator+= (initializer_list<int> values) {
        // Do nothing   
    }
    
    void operator+ (initializer_list<int> values) {
        // Do nothing
    }
};

int main() {
    AddInitializerList adder;
    adder += {1, 2, 3};  // Totally legit
    adder +  {1, 2, 3};  // Not okay!
    
    return 0;
}

main中括弧で囲まれた初期化リストを使用するの行はコンパイルされません (そして、以前の質問をした後、その理由がわかりました)。ただし、を使用するコードが実際に問題なくコンパイルされるoperator+理由がわかりません。operator+=main

+=オーバーロードしても問題なく動作するのに対し、ここではオーバーロードが機能しない理由が正確にはわかりません。標準には、演算子のコンテキストでは中括弧で囲まれた初期化子が許可されるが、演算子では許可されない+という特別な規定があるのでしょうか。それとも、これは単に奇妙なコンパイラの癖なのでしょうか。+=+

ベストアンサー1

それは、この質問(これは、リンクした質問からリンクされています)。

言語の文法では、中括弧付きリストは特定の文法コンテキストでのみ許可され、任意の式の代わりには許可されません。そのリストには代入演算子の右側部分が含まれますが、一般的な演算子の右側部分は含まれません。

+=は代入演算子ですが、+そうではありません。

代入式の文法は次のとおりです。

  代入式:
     条件式
     論理和式代入演算子初期化句
     スロー式
  代入演算子:の一つ
      = *= *= /= %= += -= >>= <<= &= ^= |=
  

おすすめ記事