Ich versuche, C ++ 0x, und insbesondere Lambda-Ausdruck und declltype zu verwenden, um einiges meines Codes zu vereinfachen, den MSVC10 RC-Compiler verwendend.
Ich habe das folgende sehr seltsame Problem festgestellt:
%Vor% Wie im Kommentar angegeben, erzeugt der Compiler einen Fehler in der Zeile foo([]() { })
.
Ich hasse es, "Compiler Bug" zu rufen, aber ich kann wirklich keine gute Erklärung für diesen Fehler sehen.
Offenbar kann der Compiler innerhalb des äußeren Lambda-Ausdrucks die Funktionsschablone foo
für das innere Lambda nicht spezialisieren.
Wenn jedoch die Definition von foo
geändert wird, wird der Rückgabetyp wie folgt codiert:
dann kompiliert alles gut.
Gibt es eine obskure Eigenart von declltype, wenn sie verwendet wird, um den Rückgabetyp von Lambda-Ausdrucksparametern innerhalb des Bereichs eines anderen Lambda abzuleiten, dem ich nicht bewusst bin?
Die Art von 'auto' erlaubt dem Compiler, den Typ zu berechnen. Aber Ihr erstes Beispiel enthält rekursive Verweise aufeinander, so dass Sie zur Berechnung von Auto's von foo den Balken benötigen und um eine Instanz des Balkens zu erstellen, brauchen Sie das foo.
Andererseits sagt das zweite Beispiel dem Compiler explizit: "Es sollte ein Zeiger sein, um zu funktionieren, also beruhige dich eine Zeit lang". Da der Zeiger auf die Funktion gut berechnet ist, weiß der Compiler, was genau reserviert wird. Nur für Analog: vergleiche die Vorwärtsdeklaration des Mitglieds
%Vor%Tags und Links c++ lambda c++11 decltype visual-c++-2010