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.

Liege ich mit den Anforderungen falsch und die Argumente müssen kopierbar sein?Lässt der Standard in dieser Frage einen Spielraum für Implementierungen, um Argumente zu kopieren?Oder ist die Implementierung, die ich ausprobiert habe, nicht konform?

Antworten auf die Frage(2)

Ihre Antwort auf die Frage