2014-09-05 4 views
9

Ich habe gerade Is it possible to initialise an array in C++ 11 by using new operator gelesen und verstanden, aber es löst mein Problem nicht ganz.Ist es möglich, ein Array von Nicht-POD mit einer neuen Operator- und Initialisierungssyntax zu initialisieren?

Dieser Code gibt mir einen Compiler-Fehler in Clang:

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

ich erwartet hatte {{1, 2}} das Array mit einem einzelnen Element zu initialisieren, die wiederum mit den Konstruktor args initialisiert {1, 2 }, aber ich bekomme diesen Fehler:

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 
    ^

Warum funktioniert diese Syntax nicht?

+1

Weil 'A' keine Initialisiererliste als einzigen Parameter für seinen Konstruktor akzeptiert. '{1, 2}' ist eine 'std :: initialiser_list',' (1,2) 'sind zwei separate Parameter, sie sind sehr unterschiedliche Dinge. – arman

+1

FYI, g ++ 4.9 akzeptiert dieses Programm. – dyp

+3

@Arman '{1, 2}' ist eine * Klammer-Init-Liste *. Braced-Init-Listen müssen nicht die Konstruktoren "initializer_list" aufrufen. Braced-Init-Listen sind allgemeiner, sie sind Teil einer * einheitlichen Initialisierung *. – dyp

Antwort

12

Dies scheint clang++ bug 15735 zu sein. Deklarieren Sie einen Standard-Konstruktor (zugänglich und kann nicht gelöscht zu machen) und das Programm kompiliert, obwohl der Standard-Konstruktor nicht aufgerufen wird:

#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 übernimmt auch das Programm des OP ohne Modifikationen.

Verwandte Themen