Por que a passagem de argumentos de referência de object para a function de thread não é compilada?

Cheguei a um problema usando a nova interface c ++ 11 std::thread .
Eu não consigo descobrir como passar uma referência a um std::ostream para a function que o thread irá executar.

Aqui está um exemplo de passar um inteiro (compilar e funcionar como esperado no gcc 4.6):

 void foo(int &i) { /** do something with i **/ std::cout << i << std::endl; } int k = 10; std::thread t(foo, k); 

Mas quando tento passar um ostream não compila:

 void foo(std::ostream &os) { /** do something with os **/ os << "This should be printed to os" << std::endl; } std::thread t(foo, std::cout); 

Existe uma maneira de fazer isso, ou não é possível?

NB: a partir do erro de compilation parece vir de um construtor excluído …

    Os tópicos copiam seus argumentos (pense nisso, essa é a coisa certa). Se você quer uma referência explicitamente, você tem que envolvê-la com std::ref (ou std::cref para referências constantes):

     std::thread t(foo, std::ref(std::cout)); 

    (O wrapper de referência é um wrapper com semântica de valor em torno de uma referência. Isto é, você pode copiar o wrapper e todas as cópias conterão a mesma referência.)

    Como de costume, esse código só está correto desde que o object para o qual você se refere permaneça ativo. Emptor de advertência.

     void foo(intstd::ostream &os) 

    não parece um C ++ válido para mim.