Der folgende Code kompiliert sauber mit GCC:Ist es legal, den vorherigen Funktionsparameter zu verwenden, um einen neuen zu deklarieren?
void func(int arg1, decltype(arg1) arg2)
{
(void)arg2;
}
int main(){}
ich diesen Befehl zu kompilieren:
g++ -std=c++14 test.cpp -o test -pedantic-errors -Wall -Wextra
Aber eine solche Verwendung eines Parameters in der Mitte der Funktionsdeklaration seltsam scheint. Ist es tatsächlich in Standard C++ gültig, oder ist es eine GCC-Erweiterung?
Ich gehe davon aus, dass die Art von 'arg1' ist viel komplexer in Ihrem aktuellen Code? Und ohne auf die Spezifikation oder irgendwelche Referenzen zu schauen, aber etwas über Parsing zu wissen, würde ich denken, dass es in Ordnung ist, weil das Parsen von Sprachen wie C++ sehr viel von oben nach unten von links nach rechts ist. Wenn der Compiler die Deklaration für 'arg2' analysiert, muss er bereits die Deklaration von 'arg1' analysiert haben, so dass er definitiv den Typ von 'arg1' kennt. Wenn es wirklich "erlaubt" ist, weiß ich nicht, auch wenn es in die entgegengesetzte Richtung funktioniert (mit 'declltype (arg2)' für 'arg1'). –
@JoachimPileborg natürlich hat der tatsächliche Code viel komplexeren Typ für 'arg1', sonst würde ich sogar daran denken,' declltype' darauf zu verwenden. – Ruslan
FWIW, MSVC++ 2013 und seine Intellisense (EDG) akzeptieren beide ebenfalls. – MSalters