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).
Wenn das der Fall ist, sind neu (buf) (X) und neu (buf) X gleich? Danke –
@KenmanTsang Ja, wenn mein Lesen der Standardsprache richtig ist. – 1201ProgramAlarm