La domanda esistente su Why can't I initialise an array of objects if they have private copy constructors? si riferisce specificamente a C++ 03. So da quella domanda che quello che sto cercando di fare non è permesso in C++ 03 ma ho pensato che dovrebbe essere possibile in C++ 11Come inizializzare l'array di classi con il costruttore di copie cancellato (C++ 11)
Ho una classe non mobile (chiamala Child) e Ho bisogno di inizializzare un array di Child nel costruttore di un'altra classe (chiamalo Parent). Con "non-mobile" intendo che l'indirizzo di un oggetto Child deve rimanere uguale durante la sua vita. Qual è il modo corretto per farlo?
Con C++ 11 Ho provato quanto segue:
class Child
{
public:
Child (int x) {}
~Child() {}
Child (const Child &) = delete;
};
class Parent
{
public:
Parent() : children {{5}, {7}} {}
private:
Child children[2];
};
Questo codice compila bene con Clang 3.5.0, ma GCC 4.9.1 lamenta che sto cercando di utilizzare il costruttore di copia eliminata:
test.cc: In constructor ‘Parent::Parent()’:
test.cc:13:35: error: use of deleted function ‘Child::Child(const Child&)’
Parent() : children {{5}, {7}} {}
^
test.cc:7:5: note: declared here
Child (const Child &) = delete;
^
ho letto circa la differenza tra la copia-inizializzazione e-inizializzazione diretta (here e here, per esempio), e voglio evitare di chiamare il costruttore di copia utilizzando-inizializzazione diretta. Sto ottenendo la sintassi sbagliata? È un bug in GCC? O è quello che sto cercando di fare solo non è possibile?
Mi sembra un bug clang e non un bug di gcc. clang non riesce a compilare il codice se lo si cambia in 'children {Child {5}, Child {7}}', che dovrebbe comportarsi in modo identico a ciò che hai postato. Una soluzione alternativa sarebbe usare un 'vector' e inserire gli oggetti' Child'. – Praetorian
g ++ ha esito positivo con 'Child child [2] {{5}, {7}};' che dovrebbe essere identico alla versione in cui si verifica lo stesso inizializzatore nell'elenco di inizializzatori ctor; entrambi sono coperti da [dcl.init.list]/3 –
Leggendo le sezioni sull'inizializzazione, questo codice sembra corretto; 'children [2] = {{5}, {7}}' dice che 'children [0]' è copy-initializaed da '{5}', cioè è uguale a 'Child c = {5};', e questo è coperto di nuovo da [dcl.init.list] che richiama il costruttore per 'c' che prende' int' (senza coinvolgere una copia). –