Lambda arbeitet mit dem neuesten Visual Studio, funktioniert aber nicht anderswo

8

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?

    
Jonathan Mee 12.12.2016, 15:05
quelle

1 Antwort

10

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 :

verwenden %Vor%

Live-Demo

    
TartanLlama 12.12.2016, 16:00
quelle