Diciamo che ho il seguente codice:È possibile utilizzare la sintassi di inizializzazione delle parentesi graffe C++ 11 per evitare di dichiarare costruttori banali per aggregati semplici?
#include <vector>
struct Foo
{
int tag = 0;
std::function<void()> code;
};
int main()
{
std::vector<Foo> v;
}
E ora voglio aggiungere una nuova voce di Foo
al vettore con lo specifico tag
e code
senza creare in modo esplicito una temporanea. Ciò significa che devo aggiungere un costruttore per Foo
:
struct Foo
{
inline Foo(int t, std::function<void()> c): tag(t), code(c) {}
int tag = 0;
std::function<void()> code;
};
E ora posso usare emplace_back
:
v.emplace_back(0, [](){});
Ma quando ho dovuto farlo di nuovo - per il momento 100 - con una struttura di nuova creazione , Ho pensato: non posso usare l'inizializzatore controvento? In questo modo:
#include <vector>
struct Foo
{
int tag = 0;
std::function<void()> code;
};
int main()
{
std::vector<Foo> v;
v.push_back(Foo{ 0, [](){} });
}
che mi dà un errore di compilazione (non può convertire da 'inizializzazione-list' a 'Foo'), ma spero che questo può essere fatto e ho appena ricevuto la sintassi sbagliata.
Nota questa modifica in C++ 14, dove 'Foo' è un aggregato e può essere inizializzato utilizzando l'inizializzazione di aggregazione. – chris
Wow, è del tutto inaspettato. Grazie! –
Grazie a @chris, ogni giorno imparo qualcosa di nuovo su C++ –