To pytanie jest kontynuacją ostatniej kwestii kopalni:
What is this compiler error when using a lambda as a template parameter?Lambda zwracająca lambdę nieprawidłowo podaje typ zwrotu?
11 listopada 2014: Microsoft zareagował mówiąc, że poprawka do tego błędu powinno pokazać się w następnej wersji Visual C++.
Ten kod nie skompilować za pomocą VS2012 (Update 2):
int main(int argc, char* argv[])
{
auto f = []()
{
int n = 0;
auto r = [=]{ return n; };
return r;
};
return 0;
}
Jest to błąd kompilatora uzyskać:
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
- Jest jakiś problem z kodem zgodnym ze specyfikacją C++ 11?
- Czy występuje problem z kodem zgodnie ze zdefiniowaną przez VS2012 częściową obsługą C++ 11?
- A może to błąd kompilatora VS2012 C++?
- Może ktoś mi punkt do miejsca w specyfikacji C++ 11, który mówi o tym, jak lambda musi być niejawnie rzutować do wskaźników funkcji?
- wspominam ten jest tylko dla bezpaństwowców lambdas - tych z klauzulami pustych przechwytywania - co wewnętrzna lambda
r
jest nie - Dlaczego więc wydaje się, że wywnioskować typ zwracany lambda
f
jest funkcją wskaźnik, a mianowicieint (__cdecl *)(void)
?
- wspominam ten jest tylko dla bezpaństwowców lambdas - tych z klauzulami pustych przechwytywania - co wewnętrzna lambda
Powiedzmy, że to z powodu słabego implementacja :-) –
@CaptainObvlious Okay - ale rzutowanie na wskaźnik funkcji jest jawnie * zabronione * dla * stateful * lambdas, prawda? –
[Nie jestem pewien, jak _ "nie" _ wpadł w mój wcześniejszy komentarz - przepraszam;)] Zgodnie z 5.1.2/6 konwersja _jest_ wymagana, jeśli nie ma przechwycenia. Standard nie wyklucza jednak jawnie, że konwersja nie została uwzględniona dla stanów lambdas. Moje zrozumienie jest takie, że nie jest możliwe, aby implementacja mogła uwzględniać konwersję nawet dla stanów lambd. –