std :: thread com argumento móvel e não copiável
O programa a seguir não é construído no VS11 beta, no gcc 4.5 ou no 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>
Isso ocorre porque o tipo de argumento não é copiável, mas a implementação tenta copiá-lo.
Tanto quanto eu posso dizer, este programa está bem formado e deve funcionar. Os requisitos para std :: thread parecem implicar que argumentos móveis e não copiáveis devem funcionar aqui. Especificamente, ele diz que o objeto que pode ser chamado e cada argumento devem satisfazer os requisitos MoveConstructible, e queINVOKE(DECAY_COPY(std::forward<F>(f)),DECAY_COPY(std::forward<Args>(args))...)
deve ser uma expressão válida.
Neste caso, acho que a expressão funciona para algo como:
<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>
E eu não acho que isso deveria envolver uma cópia dop
. O gcc, pelo menos, pode compilar esta expressão, embora o VS11 não o faça.