2013-05-23 7 views
12

Nachstehend ist mir ein Fehler in Visual Studio 2012.Mit std :: Umzug ein std :: unique_ptr senden std :: thread in VS1012

void do_something(std::unique_ptr<int> i); 
std::unique_ptr<int> i(new int); 
std::thread(do_something, std::move(i)); 

Fehler 3 Fehler C2248: ‚std: : unique_ptr < _Ty> :: unique_ptr ': kann nicht auf privates Mitglied zugreifen, das in der Klasse' std :: unique_ptr < _Ty> 'c: \ Programmdateien (x86) Microsoft Visual Studio 11.0 \ vc \ include \ functional 1152 1 Scratch It ist hilfreich (!) zeigt auf diese Definition in funktionalen: _VARIADIC_EXPAND_0X (_CLASS_BIND,,,,)

Das ist in Ordnung:

do_something(std::move(i)); 

Was mache ich falsch?

+0

Ich habe gehört, dass GCC 4.6 einen ähnlichen Fehler hatte, der in 4.7 behoben wurde: "Der std :: thread muss erkennen, wenn ein rvalue übergeben wird (nicht kopieren) es in seinen internen Speicher und sollte dann weiterleiten zur verpackten Funktion wieder als rvalue "Danke an Jon Wakely doctorlove

Antwort

4

Was mache ich falsch?

Fast nichts. In der Tat ist Ihr Programm legal und sein Verhalten ist gut definiert.

Der Compiler-Fehler, den Sie erhalten, ist notwendigerweise ein Fehler in der Implementierung der Standardbibliothek, die mit Ihrem Compiler geliefert wird, vielleicht verbunden mit der Tatsache, dass VC11 variadische Vorlagen nicht unterstützt, und den Makro-Maschinen, die sie fälschen ist nicht perfekt.

Dieser sagte, auch wenn Ihr Programm hat kompilieren, würden Sie noch Ihren Thread verbinden oder von ihm zu lösen, bevor der std::thread RAH-Wrapper zerstört wird - eine Ausnahme ausgelöst wird, wenn der Destruktor von std::thread aufgerufen wird, während der verkapselte Thread läuft noch (es sei denn, es wurde gelöst).

+0

Was denkst du ist das Problem hier? http://ideone.com/lFk3jA#view_edit_box –

+1

@MattPhillips: Das ist ein Laufzeitfehler, und das Problem ist wahrscheinlich, dass '-pthread' nicht verwendet wurde, um Thread-Unterstützung zu aktivieren. –

+0

@MattPhillips meinen vorherigen Kommentar editieren: Sie müssen noch den Thread in 'main' beitreten, neben dem Kompilieren mit dem '-pthread' Flag auf' gcc'. – juanchopanza

Verwandte Themen