2017-05-17 3 views
0

Die Visual Studio-Compiler (MSVC 2015) ist nicht in der Lage, das folgende einfache Stück Code zu kompilieren:Lambda in Lambda kann keine Vorlage sein?

int main() { 
    auto foo = [](auto callback) { 
     callback(int{}); 
    }; 
    auto rexs = [&foo]() { 
     foo([](auto tg) {}); 
    }; 
} 

Es barfs einen internen Compiler-Fehler:

fatal error C1001: An internal error has occurred in the compiler. 

VC++ mag Fehlern geben C1001, wenn die kompilierter Code enthält Fehler (dh der Programmierer hat einen Fehler gemacht, aber VC++ erkennt den Fehler im Code nicht vollständig), also frage ich mich, ob ich hier einen Fehler gemacht haben könnte.

Aber aus allen Perspektiven kann ich sehen, mein Code sieht standardkonform aus, und es scheint wie ein VC++ Bug für mich. Denke ich richtig?

+6

"ein interner Fehler in dem Compiler aufgetreten ist." ist immer ein Fehler (in der Compiler/Tool-Kette), ob der Reproduktionscode gültig ist oder nicht. Obwohl der Fehler schwerwiegender ist, wenn der Code gültig ist. – user2079303

+1

'VC++ gibt gerne Fehler C1001, wenn der kompilierte Code Fehler enthält (d. H. Der Programmierer hat einen Fehler gemacht, aber VC++ erkennt den Fehler im Code nicht vollständig). Selbst wenn das stimmt, ist es immer noch ein Compilerfehler. Wenn VS denkt, dass der Code falsch ist, sollte es einen Grund haben, das zu denken. – deviantfan

+0

@ user2079303 Ich habe C1001 so oft in meinen Projekten gesehen, als ich einen kleinen Syntaxfehler gemacht habe, dass ich mich nicht mehr darum schäme, meinen Compiler dafür zu schimpfen. – Bernard

Antwort

2

Ihr Code kompiliert gut mit clang 3.8 und gcc 5.4 (http://rextester.com/SCAH69935), so scheint es ein VC++ Bug zu sein.

+1

"C1001" ist * immer * ein VC++ Bug. – Donnie

+1

Es scheint auf einem Online-Compiler VS 2017 zu kompilieren. [Dieser.] (Http://webcompiler.cloudapp.net/) Vielleicht ist es Zeit für ein Upgrade. – Bernard

-2

VC++ ist richtig: C++ 11 erlaubt nicht auto in Lambda. Wir können in Lambda nur seit C++ 14 verwenden.

Clang 3.8.0 gibt mir diesen Fehler mit den -std=c++11:

main.cpp:7:17: error: 'auto' not allowed in lambda parameter 
    auto f = [](auto x) { return x + 1;}; 

und gcc 7.1.0 (mit der gleichen Flagge) gibt mir diese: main.cpp: In der Funktion ‚int main() ‚:

main.cpp:7:17: error: use of 'auto' in lambda parameter declaration only available with -std=c++14 or -std=gnu++14 

    auto f = [](auto x) { return x + 1;}; 

für diesen Code:

int main() 
{ 
    auto f = [](auto x) { return x + 1;}; 
} 
+1

Das macht "internen Compiler-Fehler" nicht korrekt. – Donnie

+0

Mein Tag war falsch. Es sollte C++ 14 sein. Danke, dass du es aufgezeigt hast. – Bernard

+0

wahr, aber es bedeutet nicht, dass der Code entweder – nefas

Verwandte Themen