Seltsames GCC-Array-Initialisierungsverhalten

20

Ich habe bei der Betrachtung einer anderen Frage eine Variante dieses Codes gefunden (der ursprüngliche Code verwendete std::thread anstelle von std::vector , aber die Syntax ist gleich):

%Vor%

Dieser Code sollte nicht kompiliert werden; std::vector<double> vecs[10] = std::vector<double>(10, 1); ist keine gültige Initialisierungssyntax, und clang lehnt es mit error: array initializer must be an initializer list ab. GCC akzeptiert es jedoch und scheint jeden Vektor in der Liste mit einer Kopie des angegebenen temporären zu initialisieren.

Ist das eine GCC-Erweiterung, von der ich noch nie gehört habe (die irgendwie auch -pedantic-errors überlebt hat) oder nur ein einfacher Bug?

    
T.C. 24.06.2014, 05:24
quelle

2 Antworten

4

Ich würde dies als einen Fehler betrachten.

%Vor%

Funktioniert (wie Sie gesehen haben).

Während

%Vor%

ergibt den (erwarteten) Fehler.

    
choeger 24.06.2014, 17:08
quelle
2

Weitere Untersuchung:

%Vor%

Dies wird in GCC kompiliert.

%Vor%

Kompiliert auch in GCC 4.9, aber nicht in früheren Versionen, die ich getestet habe (4.6-4.8).

%Vor%

Kompiliert nicht.

%Vor%

Kompiliert.

%Vor%

Kompiliert nicht.

Ich denke, es ist sicher zu sagen, dass es ein Fehler ist. Keine vernünftige Erweiterung hätte diese Art von Verhalten. Beachten Sie, dass A sowohl im zweiten Fall als auch im dritten Fall POD-Typen sind (der einzige Unterschied ist ein explizit voreingestellter Standardkonstruktor), aber sie werden von GCC 4.9 anders behandelt.

Bearbeiten: Wenn Sie den GCC-Bugzilla erneut durchsuchen, scheint dieser Fehlerbericht damit in Zusammenhang zu stehen. Sieht so aus, als hätte ich es beim ersten Mal verpasst, weil der Titel über String-Literale gesprochen hat.

    
T.C. 24.06.2014 22:03
quelle

Tags und Links