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.

¿Me equivoco con los requisitos y los argumentos deben poder copiarse?¿El estándar deja algún margen de maniobra en este tema para que las implementaciones copien argumentos?¿O es la implementación que probé no conforme?

Respuestas a la pregunta(2)

Su respuesta a la pregunta