Inicjowanie niestatycznych elementów nie może być wykonane przed C++ 11. Jeśli kompilujesz z kompilatorem C++ 11, powinieneś z radością przyjąć kod, który podałeś.
Wyobrażam sobie, że powodem, dla którego nie zezwolono na to w pierwszej kolejności, jest to, że deklaracja członka danych nie jest definicją. Nie ma obiektu, który zostanie wprowadzony. Jeśli masz element danych, taki jak int x;
, nie tworzy się obiekt int
, dopóki nie zostanie utworzony obiekt typu klasy. Dlatego inicjator tego elementu byłby mylący. Dopiero w trakcie budowy można przypisać wartość członkowi, do czego służą właśnie listy inicjalizacji członków.
Wystąpiły również problemy techniczne, które należało wyeliminować przed dodaniem statycznego elementu inicjującego. Rozważmy następujące przykłady:
struct S {
int i(x);
// ...
static int x;
};
struct T {
int i(x);
// ...
typedef int x;
};
Kiedy te struktury są przetwarzane, w momencie analizowania elementu i
, jest niejednoznaczna, czy jest to deklaracja członek danych (jak w S
) lub deklaracja funkcji członka (jak w T
).
Z dodaną funkcjonalnością nie stanowi to problemu, ponieważ nie można zainicjować elementu składającego się z tej składni parantheses. Musisz użyć nawiasów lub równy-inicjator takich jak:
int i = x;
int i{x};
te mogą być jedynie członkami danych i tak nie mamy problemu więcej.
Zapoznaj się z propozycją N2628, aby dokładniej przyjrzeć się problemom, które należało wziąć pod uwagę przy proponowaniu niestatycznych inicjalizatorów elementów.
Możesz w C++ 11. – chris
Mój kompilator powiedział mi: * "Błąd: inicjator elementu danych jest niedozwolony" *. – danijar
Twój kompilator nie obsługuje jeszcze (wszystkich) C++ 11. –