std :: hilo con argumento movible, no copiable
El siguiente programa no se construye en VS11 beta, gcc 4.5 o 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>
Esto se debe a que el tipo de argumento no se puede copiar, pero la implementación intenta copiarlo.
Por lo que puedo decir, este programa está bien formado y debería funcionar. Los requisitos para std :: thread parecen implicar que los argumentos móviles y no copiables deberían funcionar aquí. Específicamente dice que el objeto llamable y cada argumento deben satisfacer los requisitos de MoveConstructible, y queINVOKE(DECAY_COPY(std::forward<F>(f)),DECAY_COPY(std::forward<Args>(args))...)
Será una expresión válida.
En este caso creo que la expresión se resuelve en 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>
Y no creo que esto deba implicar una copia dep
. gcc al menos puede compilar esta expresión, aunque VS11 no lo hace.