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.