Sagen wir, ich habe den folgenden Code:Kann ich die C++ 11-Klammerinitialisierungssyntax verwenden, um zu vermeiden, dass triviale Konstruktoren für einfache Aggregate deklariert werden?
#include <vector>
struct Foo
{
int tag = 0;
std::function<void()> code;
};
int main()
{
std::vector<Foo> v;
}
Und jetzt will ich mit dem spezifischen tag
und code
ohne explizit die Schaffung eines temporären ein neues Foo
Artikel zum Vektor hinzuzufügen. Das bedeutet, dass ich einen Konstruktor für Foo
hinzufügen:
struct Foo
{
inline Foo(int t, std::function<void()> c): tag(t), code(c) {}
int tag = 0;
std::function<void()> code;
};
Und jetzt kann ich emplace_back
:
v.emplace_back(0, [](){});
Aber wenn ich hatte dies wieder tun - zum 100. Mal - mit einer neu geschaffenen Struktur , Dachte ich: kann ich den Klammerinitialisierer nicht benutzen? Wie so:
#include <vector>
struct Foo
{
int tag = 0;
std::function<void()> code;
};
int main()
{
std::vector<Foo> v;
v.push_back(Foo{ 0, [](){} });
}
, dass mir einen Übersetzungsfehler gibt (nicht konvertieren von ‚Initialisierer-Liste‘ auf ‚Foo‘), aber ich hoffe, dass dies getan werden kann, und ich habe gerade die Syntax falsch.
Beachten Sie diese Änderungen in C++ 14, wobei 'Foo' ein Aggregat ist und mithilfe der Aggregat-Initialisierung initialisiert werden kann. – chris
Wow, das ist völlig unerwartet. Vielen Dank! –
Danke @chris, jeden Tag lerne ich etwas Neues über C++ –