2014-09-05 7 views
9

Ho appena letto e capito Is it possible to initialise an array in C++ 11 by using new operator, ma non risolve il mio problema.È possibile inizializzare un array di non POD con la sintassi dell'operatore new e initialiser?

Questo codice mi dà un errore di compilazione in Clang:

struct A 
{ 
    A(int first, int second) {} 
}; 
void myFunc() 
{ 
    new A[1] {{1, 2}}; 
} 

mi aspettavo {{1, 2}} per inizializzare l'array con un unico elemento, a sua volta inizializzato con i args costruttore {1, 2 }, ma ottengo questo errore:

error: no matching constructor for initialization of 'A' 
    new A[1] {{1, 2}}; 
      ^
note: candidate constructor not viable: requires 2 arguments, but 0 were provided 
    A(int first, int second) {} 
^
note: candidate constructor (the implicit copy constructor) not viable: requires 1 argument, but 0 were provided 
struct A 
    ^

Perché questa sintassi non funziona?

+1

Perché 'A' non accetta un elenco di inizializzatori come unico parametro del suo costruttore. '{1, 2}' è un 'std :: initializer_list',' (1,2) 'è due parametri separati, sono cose molto diverse. – arman

+1

FYI, g ++ 4.9 accetta questo programma. – dyp

+3

@Arman '{1, 2}' è un * braced-init-list *. Le liste bretelle-init non devono chiamare costruttori 'initializer_list'. Gli elenchi bretelle-init sono più generali, fanno parte dell'inizializzazione * uniforme *. – dyp

risposta

12

Questo sembra essere clang++ bug 15735. Dichiarare un costruttore di default (che lo rende accessibile e non eliminato) e il programma viene compilato, anche se il costruttore di default non viene chiamato:

#include <iostream> 

struct A 
{ 
    A() { std::cout << "huh?\n"; } // or without definition, linker won't complain 
    A(int first, int second) { std::cout << "works fine?\n"; } 
}; 
int main() 
{ 
    new A[1] {{1, 2}}; 
} 

Live example

g ++ 4.9 accetta anche il programma del PO senza modifiche.

Problemi correlati