2013-12-19 8 views
5

Warum stürzt dieser Code ab?C++ 11: std :: bind stürzt ab mit Lambda

#include <iostream> 
#include <functional> 

int main(int argc, const char * argv[]) 
{ 
    std::function<void(int)> function = [](int) 
    { 
    }; 
    auto binding = std::bind(function, 10); 

    std::function<void()> jobFunctor = binding; // crashes here with EXC_BAD_ACCESS 

    return 0; 
} 

Beim Konvertieren des Ergebnisses der binden an jobFunctor dort in einem std::function Konstruktor eine unendliche Rekursion Stapel ist.

Ich arbeite mit Mac OS X 10.8.5, kompilieren ich diesen Code mit Xcode 5.0.2 mit libC++, die Compiler-Version:

LO50F-04-198BX:$ clang++ --version 
Apple LLVM version 5.0 (clang-500.2.79) (based on LLVM 3.3svn) 
Target: x86_64-apple-darwin12.5.0 
Thread model: posix 
+0

Absturz auf gcc 4.8 und clang 3.4 auf Linux oder gcc 4.8.1 unter Windows. – Rapptz

+0

Dies stürzt auch unter OS X 10.9.1 ab. In diesem Fall ist der Segmentierungsfehler darauf zurückzuführen, dass der Stapel mit einer unendlichen Anzahl von rekursiven Funktionsaufrufen in std :: bind überläuft. –

+0

Es sollte gut funktionieren: http://ideone.com/GXGIBx – Snps

Antwort

6

ich ziemlich sicher bin, dass dieser Code funktionieren sollte, und dass Es ist ein Fehler in der Implementierung von libC++.

Ich habe einen Fehlerbericht für Sie auf dem libC++ Bug Tracker veröffentlicht. http://llvm.org/bugs/show_bug.cgi?id=18282

Bearbeiten: Und wie Casey darauf hingewiesen hat, wurde dies bereits in libC++ behoben. Jetzt müssen Sie nur warten, bis Apple eine aktualisierte Version von libC++ in einer der kommenden Versionen von XCode/OS X veröffentlicht.

+0

Sieht sehr ähnlich aus wie http: // llvm. org/bugs/show_bug.cgi? id = 16385 – Casey

+0

@Casey: Ich denke, Sie haben Recht. Meine Suche ergab leider nichts. –

+0

@Casey: Besonders wenn man sich den Testfall anschaut, der mit diesem Fehler in Verbindung steht, ist es ziemlich klar, dass sie sich auf dasselbe beziehen. [Der Testfall, den sie hinzugefügt haben, kann hier gefunden werden] (http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/utilities/function.objects/bind/func.bind/func.bind.bind/ copy.pass.cpp? view = Markup & Pfadrev = 185297). –

Verwandte Themen