2012-12-19 11 views
9

Mögliche Duplizieren:
C++11 emplace_back on vector<struct>?emplacing einen POD

Ist Einlagerungs möglich mit PODs? Es scheint nicht 2012 in Visual Studio zu arbeiten:

struct X 
{ 
    int a; 
    int b; 
}; 

void whatever() 
{ 
    std::vector<X> xs; 
    X x = {1, 2}; 

    // okay 
    xs.push_back(x); 

    // okay 
    xs.emplace_back(x); 

    //error C2661: 'X::X': error C2661: no overloaded function takes 2 arguments 
    xs.emplace_back(1, 2); 
} 

Ist das nur ein Manko von Visual Studio 2012 oder ein POD einfach nicht in sich emplacing C++ 11?

+0

Es baut es an Ort und Stelle. Es gibt keinen solchen Konstruktor. – chris

+0

Ich würde es nicht definitiv betrachten, aber g ++ (4.7.1) akzeptiert es auch nicht. –

+0

Ich denke, Sie müssen wahrscheinlich einen Konstruktor für 'X' haben, der zwei Argumente benötigt (wie die Fehlermeldung suggeriert). –

Antwort

5

Es gibt keinen Konstruktor X::X(int,int), den Ihr Aufruf an emplace_back verwenden würde, um das X Objekt zu erstellen. Container verwenden allocator_traits<A>::construct(allocator, p, args), um Objekte zu konstruieren, wobei ein Zeiger auf einen zugewiesenen Speicherplatz ist und args die Argumente sind, die an den Konstruktor übergeben werden. Dies wird von emplace_back verwendet. Diese construct Funktion ruft ::new((void*)p) T(std::forward<Args>(args)...) auf, so dass es keine einheitliche Initialisierung verwendet.

wird auch ein Fehler sein, trotz der Tatsache, dass ein Aggregat mit List-Initialisierung erstellt werden kann. Das liegt daran, dass eine in Klammern eingeschlossene Initialisierungsliste nicht weitergeleitet werden kann.

+0

funktioniert gut mit einem kompatiblen Compiler, aber nicht mit VC++ 2012 (noch). : -] – ildjarn

+3

'emplace_back ({1, 2})' ist ein Fehler, 'push_back ({1, 2})' funktioniert aber. Die Initialisierung der Liste kann im ersten Fall nicht stattfinden, da es nichts zu initialisieren gibt (informell gesprochen), es ist ein notwendiges Übel mit dem Argumentabzug der Vorlage. –

+0

@LucDanton Danke, du hast Recht. –