2013-05-16 6 views
7

Es gibt diesen Code:Brace Initialisierung für die Klasse mit virtueller Funktion

struct A { 
    int x; 
    void f() {} 
}; 

struct B { 
    int y; 
    virtual void f() {} 
}; 

A a = {2}; 

//B b = {3}; error: no matching constructor for initialization of 'B' 

int main() { 
    return 0; 
} 

Warum Initialisierung für variable a funktioniert, aber nicht für variable b?

+1

Brace-Initialisierung funktioniert nur für POD-Typen; Machen Sie Ihre Methode virtuell macht es nicht-POD – antlersoft

+2

[Was sind Aggregate und Pods und wie/warum sie besonders sind] (http://stackoverflow.com/questions/4178175/what-are-aggregates-and-pods-and-how -White-sind-sie-speziell) –

Antwort

10

A ist ein Aggregat, und so kann Klammerinitialisierung haben, und B ist nicht, da es eine virtuelle Methode hat.

8.5.1 Aggregates

ein Aggregat ist, ein Array oder eine Klasse (Abschnitt 9) ohne Benutzer bereitgestellten Konstruktoren (12.1), ohne Verstrebung-or-gleichschenkliger Initialisierungen für nicht- statische Datenelemente (9.2), keine privaten oder geschützten nicht statischen Datenelemente (Abschnitt 11), keine Basisklassen (Abschnitt 10) und keine virtuellen Funktionen (10.3).

+1

Die Antwort ist richtig, aber es gibt keine Notwendigkeit, mit dem '11-Standard zu qualifizieren, da die Antwort in C++ 98, C++ 03 und C++ 11 identisch ist –

+0

@ DavidRodríguez-dribeas Nochmals vielen Dank. Ich war mir nicht sicher, ob dies in Aggregat oder POD in C++ 03 formuliert wurde. – juanchopanza

+0

konnten Sie nicht einen Klammerinitialisierer-Konstruktor jedoch schreiben? eine Initialisierungsliste als arg nehmen? –

Verwandte Themen