std :: thread mit beweglichem, nicht kopierbarem Argument
Das folgende Programm ist nicht in VS11 Beta, GCC 4.5 oder Clang 3.1 enthalten
<code>#include <thread> #include <memory> int main() { std::unique_ptr<int> p; std::thread th([](std::unique_ptr<int>) { },std::move(p)); th.join(); } </code>
Dies liegt daran, dass der Argumenttyp nicht kopierbar ist, die Implementierung jedoch versucht, ihn zu kopieren.
Soweit ich das beurteilen kann, ist dieses Programm gut strukturiert und sollte funktionieren. Die Anforderungen für std :: thread scheinen zu implizieren, dass bewegliche, nicht kopierbare Argumente hier funktionieren sollten. Insbesondere heißt es, dass das aufrufbare Objekt und jedes Argument die MoveConstructible-Anforderungen erfüllen müssenINVOKE(DECAY_COPY(std::forward<F>(f)),DECAY_COPY(std::forward<Args>(args))...)
soll ein gültiger Ausdruck sein.
In diesem Fall funktioniert der Ausdruck meiner Meinung nach wie folgt:
<code>template <class T> typename std::decay<T>::type decay_copy(T&& v) { return std::forward<T>(v); } std::unique_ptr<int> p; auto f = [](std::unique_ptr<int>) {}; decay_copy(f)(decay_copy(std::move(p))); </code>
Und ich glaube nicht, dass es sich dabei um eine Kopie von handeln sollp
. Zumindest gcc kann diesen Ausdruck kompilieren, VS11 jedoch nicht.