2013-07-03 11 views
5

Jeśli wszystkim członkom danych klas/danych strukturalnych brakuje inicjalizatorów, do skonstruowania obiektu można użyć jednolitej składni inicjalizacji.Dlaczego niestatyczni inicjalizatorzy elementów danych pokonują jednolitą składnię inicjalizacji?

struct foo 
{ 
    int i; 
    float f; 
}; 
... 
foo bar{ 5, 3.141f }; 

Ale jeśli co najmniej jeden członek ma inicjatory, jednolita składnia inicjalizacji staje się nieważna.

struct foo 
{ 
    int i; 
    float f = 0; 
}; 
... 
foo bar{ 5, 3.141f }; // Compiler error. 

przypuszczam, że dodanie inicjatora zarejestrował dane automatycznie realizuje jeden lub więcej domyślnych konstruktorów i hamuje realizację domyślnego konstruktora initialization_list. Czy to zamierzony standard? Dlaczego to działa w ten sposób?

+8

Nie ma "domyślnej implementacji konstruktora' initializer_list' ". To, co masz w pierwszym fragmencie, nazywa się * inicjacją agregującą *. – Xeo

+1

Aby uzupełnić komentarz @ Xeo, zobacz * 8.5.1 [dcl.init.aggr] * i * 8.5.4 [dcl.init.list] *. – syam

+1

Ważne: http://stackoverflow.com/questions/4178175/what-are-aggregates-and-pods-andhow-why-are-they-special/7189821#7189821 –

Odpowiedz

1

Tak, jest to zgodne z normą. To, co próbujesz tutaj, to inicjowanie agregacji. Niestety, twój drugi foo nie jest już uważany za agregat z powodu równego inicjatora f. Patrz 8.5.1 [dcl.init.aggr] (kopalnia nacisk)

Agregat jest tablicą lub klasy (Rozdział 9) bez konstruktorów dostarczane przez użytkowników (12,1), nie brace- lub - równe inkretyzatory dla niestatycznych elementów danych (9.2), brak prywatnych lub chronionych niestatycznych członków danych (klauzula 11), brak klas bazowych (klauzula 10) i brak funkcji wirtualnych (10.3).

Bo mają równe inicjator dla członka f, trzeba będzie dostarczyć niestandardowe konstruktora wspierać składni jesteś po:

struct foo 
{ 
    int i; 
    float f = 0; 
    constexpr foo(int i, float f) : i(i), f(f) { } 
}; 
... 
foo bar{ 5, 3.141f }; // now okay 

Co do dlaczego ten został określony w standardowy, nie mam pojęcia.

+1

Pamiętaj, że jest on rozważany dla następnego standardu aby umożliwić agregację init nawet z niestatycznymi inicjalizatorami danych. – Xeo