2014-10-30 3 views
8

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.

Antwort

10

GCC ist korrekt; das ist nicht gültig.

C++ 11 8.3.6/9 [dcl.fct.default] Parameter einer Funktion dürfen in einem Standardargument nicht verwendet werden, auch wenn sie nicht ausgewertet werden.

+0

Also bedeutet das, dass es einen Bug in Clang gibt? Sollte es gemeldet werden? –

+0

@templateboy Der Standard ist zu ungenau und sollte Fälle zulassen, in denen ein Parameter in einem nicht evaluierten Operanden eines Standardarguments auftritt. – Columbo

+1

@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. –

Verwandte Themen