Also habe ich ein scheußliches Lambda geschrieben, um die Frage "die kürzeste Menge an Code, die nötig ist, um diese Frage zu erfüllen" zu erfüllen:
%Vor%Mein Problem ist, dass in Visual Studio Community 2015 Update 3 Version 14.0.25425.01 das gewünschte Ergebnis ausgegeben wird:
4.2 9.1 2.3 0.6 6.4 3.6 1.4 7.5
Aber auf all den anderen Compilern, die ich versucht habe , bekomme ich:
4.2 2.3 0.6 1.2 0.3 1.4 2.5 7.5
Kann mir jemand sagen, was das andere Verhalten verursacht?
Sie verlassen sich auf die Tatsache, dass die genaue Schließung, die Sie in den Algorithmus übergeben, diejenige ist, die als Prädikat verwendet wird, aber der Standard erlaubt es, dass sie kopiert wird:
[algorithms.general]/10 (N4140)
: [Anmerkung: Wenn nicht anders angegeben, dürfen Algorithmen, die Funktionsobjekte als Argumente verwenden, kopieren diese Funktionen Objekte frei. Programmierer, für die die Objektidentität wichtig ist, sollten in Erwägung ziehen, a Wrapperklasse, die auf ein nicht kopiertes Implementierungsobjekt wie reference_wrapper (20.9.3) zeigt, oder eine gleichwertige Lösung. -Hinweis]
Genau das tut libstdc ++. Ab Version 6.2.1:
%Vor% Dieser Aufruf von std::__find_if
am Anfang der Funktion kopiert __pred
, was bedeutet, dass der Wert von i
innerhalb von std::__find_if
um ein Prozent erhöht wird, aber das ändert nichts an dem, was beim Aufruf passiert Website.
Um dieses Problem zu beheben, könnten Sie std::ref
:
Tags und Links c++ lambda visual-studio visual-studio-2015 compiler-bug