Kann Funktionsvorlagen nicht instanziiert werden, die declltype verwendet, um den Rückgabetyp abzuleiten, wenn dieser innerhalb eines Lambda aufgerufen wird?

9

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:

%Vor%

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?

    
jalf 25.02.2010, 16:13
quelle

2 Antworten

3

Dies sind nur einige Testfälle, die Menschen beobachten können.

funktioniert

%Vor% %Vor%

schlägt fehl

%Vor% %Vor% %Vor% %Vor%

Es scheint also mit dem Bereich und dem void -Typ des internen Lambda zu tun zu haben, selbst wenn explizit gemacht. (?)

    
GManNickG 26.03.2012, 22:30
quelle
0

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%     
Dewfy 25.02.2010 16:43
quelle