In-class initializers (Funkcja C++ 11) musi być ujęty w nawiasy klamrowe lub znak a =. Nie można ich podać w nawiasie.Dlaczego w inicjatorach w klasie można używać tylko znaku = lub {}?
Jaki jest tego powód?
In-class initializers (Funkcja C++ 11) musi być ujęty w nawiasy klamrowe lub znak a =. Nie można ich podać w nawiasie.Dlaczego w inicjatorach w klasie można używać tylko znaku = lub {}?
Jaki jest tego powód?
Nie jestem w 100% pozytywny, ale może to zapobiec dwuznaczności składni. Na przykład rozważ następującą klasę:
class BadTimes {
struct Overloaded;
int Overloaded; // Legal, but a very strange idea.
int confusing(Overloaded); // <-- This line
};
Co oznacza wskazana linia? Jak napisano, jest to deklaracja funkcji składowej o nazwie confusing
, która jako parametr przyjmuje jako akceptanta obiekt typu Overloaded
(którego nazwa nie jest określona w deklaracji funkcji) i zwraca wartość int
. Jeśli C++ 11 pozwolił by inicjalizatory używały nawiasów, byłoby to niejednoznaczne, ponieważ może to być również definicja elementu typu int
o nazwie confusing
, który jest inicjowany do wartości elementu danych Overloaded
. (. Jest to związane z bieżącym numerze z Most Vexing Parse)
Żądając nawiasów klamrowych, ta dwuznaczność jest usuwany:
class BadTimes {
struct Overloaded;
int Overloaded; // Legal, but a very strange idea.
int confusing{Overloaded}; // <-- This line
};
Teraz jest jasne, że confusing
jest rzeczywiście int
inicjowane wartością Overloaded
, ponieważ nie ma sposobu, aby odczytać go jako deklarację funkcji.
Mam nadzieję, że to pomoże!
Czy możesz wyjaśnić szczegółowo, dlaczego "mylenie" jest definicją, a nie deklaracją? ** "jest to definicja funkcji członkowskiej o nazwie mylące, która jako parametr przyjmuje obiekt typu Overloaded" **. mam to zamieszanie, ponieważ powinno być dwuznaczne, prawda? –
@ Koushik - Masz rację, to powinno być deklaracja, a nie definicja. Pozwól mi to naprawić ... – templatetypedef