2016-09-24 3 views
5

Herumspielen mit der Platzierung neuer für Arrays, kam ich (zufällig/Fehler) mit dem folgenden Code:Parenthesis um die Platzierung neuer Betreiber für Arrays

#include <new> 

struct X{}; 

int main() 
{ 
    char buf[256]; 
    std::size_t n = 10; 
    X* p = new (buf) (X[n]); // incorrect way, parenthesis by mistake 
    //X* p = new (buf) X[n]; // correct way 
} 

Die dritte Zeile in main falsch ist, obwohl es kompiliert . Es sollte keine Klammer geben. clang++ spits out

Warnung: Bei Typ in den Klammern ist, Array kann nicht dynamische Größe haben

während gcc6 Ausgänge

Warnung: ISO C++ verbietet variabler Länge array [-Wvla] X * p = neu (buf) (X [n]);

Warnung: nicht konstantes Array neue Länge muss ohne Klammern um den Typ-ID [-Wvla] X * p = neu (buf) (X [n]);

dann crashes with an internal compiler error (ICE) in tree_to_uhwi, bei tree.h: 4044. Der interne Compiler-Fehler erscheint nur in gcc> = 6.

Meine Frage:? wie genau ist die Zeile „falsch“ analysiert/interpretiert markiert, warum ist es „falsch“, diese Klammern zu haben *

* Für den ICE werde ich trotzdem einen Bug ausfüllen.

EDIT 1 Ich habe erkannt, dass der ICE/Warnung (s) nichts mit benutzerdefinierten Typen zu tun, also das gleiche Verhalten für int statt struct X beobachtet wird.

BEARBEITEN 2 gcc6 bug filled here. Der ICE erscheint nicht in gcc5 oder früheren Versionen (nur die Warnungen erscheinen, die korrekt sind).

Antwort

4

Mit den Klammern kommt der neu zu type von Typ-ID, in diesem Fall X[n]. Dies ist ein Array variabler Länge, das kein Standardverhalten ist. Ohne die Klammern ist der Typ, der erneuert werden soll, ein Neu-Typ-ID, ein Array von X.

+0

Wenn das der Fall ist, sind neu (buf) (X) und neu (buf) X gleich? Danke –

+0

@KenmanTsang Ja, wenn mein Lesen der Standardsprache richtig ist. – 1201ProgramAlarm

Verwandte Themen