Dies kompiliert in clang aber nicht in gcc:Warum kann ich nicht auf ein Standardargument in seinem Initialisierer in gcc zugreifen?
void f(int x = decltype(x){});
Der Fehler in gcc sagt, dass x
nicht in diesem Umfang erklärt wurde aber nach 3.3.2/1 die Variable x
in Umfang sein soll:
Der Punkt der Deklaration für einen Namen ist unmittelbar nach seinem vollständigen Deklarator (Abschnitt 8) und vor seinem Initialisierer (falls vorhanden), außer wie unten angegeben. [Beispiel:
int x = 12; { int x = x; }
Hier zweiten
x
ist mit einem eigenen (unbestimmt) Wert initialisiert. - Ende Beispiel]
Also ist der Klang korrekt? Sollte x
in seinem eigenen Initialisierer zugänglich sein?
PS: int x = x
als Parameter schlägt in beiden Compilern fehl, aber ich weiß nicht warum.
Also bedeutet das, dass es einen Bug in Clang gibt? Sollte es gemeldet werden? –
@templateboy Der Standard ist zu ungenau und sollte Fälle zulassen, in denen ein Parameter in einem nicht evaluierten Operanden eines Standardarguments auftritt. – Columbo
@templateboy: Es ist fraglich, ob Clang oder der Standard behoben werden soll. Es gibt keinen guten Grund, es zu verbieten, wenn es nicht ausgewertet wird. –