2015-02-11 6 views
5

Gdzie w normie jest a = b + {1, 2} niedozwolone poniżej?Gdzie C++ standardu jest 'a = b + {1, 2} `dozwolone w poniższym fragmencie?

class complex { 
    double re, im; 
public: 
    complex(double r, double i) : re{ r }, im{ i } {} 
    complex& operator+=(const complex& other) { re += other.re; im += other.im; return *this; } 
}; 

inline complex operator+(complex lhs, const complex& rhs) 
{ 
    lhs += rhs; 
    return lhs; 
} 

int main() 
{ 
    complex a{ 1, 1 }; 
    complex b{ 2, -3 }; 
    a += {1, 3};   // Ok 
    a = b + {1, 2};  // doesn't compile 
} 
+0

nie mam odpowiedzi na swoje pytanie, ale należy pamiętać, że 'a = b + kompleks {1, 2};' działa jako obejście – CoryKramer

+1

Byłoby miło to komunikat eror. – jrok

+0

spojrzenie na http://en.cppreference.com/w/cpp/language/list_initialization który przedstawia konteksty, w których usztywnione inicjalizacji mogą być użyte. – qeadz

Odpowiedz

2

to jest niedozwolone, nie są wymienione w N3797 §8.5.4 [dcl.init.list]/1 (kopalni nacisk)

Uwaga: Lista inicjalizacja można stosować

  • jako inicjator w zmiennej rozdzielczości (8,5)
  • jako inicjator w nową ekspresją (5.3.4)
  • w komunikacie zwrotnym (6.6.3)
  • jak na odległości-inicjator (6.5)
  • jako argument funkcji (5.2.2)
  • jako indeks (5.2.1)
  • JAKO argument do wywołania konstruktora (8.5, 5.2.3)
  • jako inicjator dla niż statyczna składowa danych (9.2)
  • w mEM inicjatora (12.6.2)
  • na prawej boku przypisania (5,17)

Podkreślony punkt punktowy odpowiada a += {1, 3};. Nie ma sensu dodawać argumentu dodawania.

+3

Nieumieszczone w notce nienormatywnej nie jest normatywne. –

+0

@ T.C., Niestety, to najlepsze, co mam. Myślę, że bardziej poprawna odpowiedź byłaby taka, że ​​nie jest dozwolona w żadnej z tych pojedynczych odnośnych sekcji. – chris

+0

@chris Duplikat postu odpowiada całkowicie na pytanie OP IMHO – CoryKramer

Powiązane problemy