2013-05-02 17 views

Odpowiedz

26

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!

+1

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? –

+1

@ Koushik - Masz rację, to powinno być deklaracja, a nie definicja. Pozwól mi to naprawić ... – templatetypedef