2012-06-06 8 views
5
struct POD { int i, j; };  
class A { 
    POD m_pod; 
public: 
    A() : m_pod({1,2}) {} // error 
    A() : m_pod(static_cast<POD>({1,2})) {} // error 
    A() : m_pod((POD) {1,2}) {} // ok! 
}; 

Ich sehe das in einem alten Produktionscode zusammengestellt mit g++34, bis dahin kenne ich diese Funktion nicht.
Ist es eine g++ spezifische Funktion? Wenn nicht, warum wird Typecasting benötigt und das ist auch nur C-Style-Cast erlaubt?Warum ist eine C-Style-Typisierung beim Initialisieren von POD-Daten in der Initialisierungsliste zwingend erforderlich?

+0

Meine Vermutung ist, '{1,2}' ist kein POD-Typ und ein 'reinterpret_cast' geschieht. –

Antwort

4

Die Syntax, die Sie verwenden, ist nicht nur für Initialisierungslisten gedacht, sondern für jede Initialisierung von Klassentypen außerhalb ihrer Deklarationen. Zum Beispiel:

POD p; 
p = (POD) {1, 2}; 

Diese Verbindung Literale genannt werden; sie wurden zu C in C99 hinzugefügt. Sie werden nicht wirklich in C++ unterstützt; GCC erlaubt ihnen in C++ (und C89) als extension. C++ 11 adds the syntax:

p = POD({1, 2}); 

Oder in Ihrem Fall:

A() : m_pod(POD({1,2})) {} 
+0

Ich wusste auch nicht, dass GCC erlaubt 'POD p; p = (POD) {1, 2}; Syntax. Alle Antworten sind gut; akzeptiere dies für nützliche Informationen bezüglich der Erweiterungen. – iammilind

6

Eigentlich die folgende Syntax von C++ Standard-nicht erlaubt ist (sowohl C++ 03 und C++ 11):

A() : m_pod((POD) {1,2}) {} // ok! 

Da GCC Dies kompiliert ist es eine GCC-Erweiterung.

Wenn Sie es mit -pedantic Option kompilieren, gibt es diese Warnung:

pod.cpp: 8: 29: Warnung: ISO C++ verbietet Verbindung-Literale


In C++ 11, können Sie schreiben:

A() : m_pod{1,2} {} 

Demo: http://ideone.com/XaO4y

Oder einfach:

class A { 
    POD m_pod {1,2}; //in-place initialization 
public: 
    A() {} 
}; 

Ideone dies nicht, obwohl unterstützen.

Verwandte Themen