Diese Frage ist eine Fortsetzung einer aktuellen Frage von mir:
What is this compiler error when using a lambda as a template parameter?Lambda zurückkehrendes Lambda führt fälschlicherweise Rückkehrtyp?
11 Nov., 2014 Microsoft hat das Update für diesen Fehler reagiert sagen sollte ++ in der nächsten Hauptversion von Visual C angezeigt.
Dieser Code die VS2012 mit (Update 2) zu kompilieren, schlägt fehl:
1> main.cpp
1>C:\test\main.cpp(7): error C2440: 'return' : cannot convert from 'main::<lambda_c5d1d707b91a1ddedc06eb080503550c>::()::<lambda_ac357c309731f4971c3269160ed9c24b>' to 'int (__cdecl *)(void)'
1> No user-defined-conversion operator available that can perform this conversion, or the operator cannot be called
- :
int main(int argc, char* argv[]) { auto f = []() { int n = 0; auto r = [=]{ return n; }; return r; }; return 0; }
ich Dies ist der Compiler-Fehler Gibt es ein Problem mit dem Code nach C++ 11 Spezifikation?
- Gibt es ein Problem mit dem Code gemäß VS2012 definierten partiellen C++ 11 Unterstützung?
- Oder ist das ein VS2012 C++ Compiler Bug?
- Könnte mir jemand an den Ort Punkt in der C++ 11-Spezifikation, die darüber spricht, wie Lambda-Ausdrücke zu Funktionszeiger implizit umsetzbar sein muss?
- Ich erinnere mich an diese nur für staatenlos lambdas sein - jene mit leeren capture Klauseln - die die innere Lambda
r
ist nicht - Also warum es scheint, dass die abgeleitete Rückgabetyp von Lambda
f
eine Funktion ist Zeiger, nämlichint (__cdecl *)(void)
?
- Ich erinnere mich an diese nur für staatenlos lambdas sein - jene mit leeren capture Klauseln - die die innere Lambda
Lassen Sie uns sagen, dass es wegen einer schlechten ist Implementation :-) –
@CaptainObvlious Okay - aber der Cast zu Funktion Zeiger ist explizit * nicht erlaubt * für * Stateful * Lambdas, richtig? –
[Unsicher, wie _ "nicht" _ in meinen früheren Kommentar kam - sorry;)] Nach 5.1.2/6 ist die Konvertierung _is_ erforderlich, wenn sie nicht erfasst wird. Der Standard verbietet jedoch nicht ausdrücklich, dass die Umwandlung für statusbehaftete Lambdas berücksichtigt wird. Mein Verständnis ist, da es _unspecified_ ist, ist die Implementierung frei, die Umwandlung sogar für stateful lambdas einzuschließen. –