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.

Estou errado sobre os requisitos e os argumentos devem ser copiáveis?O padrão deixa qualquer margem de manobra nesta questão para as implementações copiarem argumentos?Ou a implementação eu tentei não estar em conformidade?

questionAnswers(2)

yourAnswerToTheQuestion