std :: thread with movable, non-copyable argument

Poniższy program nie tworzy wersji VS11 beta, gcc 4.5 lub clang 3.1

<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>

Dzieje się tak, ponieważ typ argumentu nie jest kopiowalny, ale implementacja próbuje go skopiować.

O ile wiem, ten program jest dobrze uformowany i powinien działać. Wymagania std :: thread wydają się sugerować, że ruchome, nie kopiowalne argumenty powinny działać tutaj. Mówi w szczególności, że obiekt wywoływalny i każdy argument muszą spełniać wymagania MoveConstructible i tak dalejINVOKE(DECAY_COPY(std::forward<F>(f)),DECAY_COPY(std::forward<Args>(args))...) jest ważnym wyrażeniem.

W tym przypadku myślę, że wyrażenie działa jak coś:

<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>

I nie sądzę, żeby miało to obejmować kopięp. gcc może przynajmniej skompilować to wyrażenie, chociaż VS11 tego nie robi.

Czy mylę się co do wymagań, a argumenty muszą być możliwe do skopiowania?Czy standard pozostawia jakiekolwiek pole manewru w tej kwestii dla implementacji do kopiowania argumentów?A może implementacja była niezgodna z zasadami?

questionAnswers(2)

yourAnswerToTheQuestion