¿Por qué el pasar argumentos de referencia de objeto a la función thread falla al compilar?


He llegado a un problema con la nueva interfaz de c++11 std::thread.
No puedo averiguar cómo pasar una referencia a un std::ostream a la función que el hilo ejecutará.

Aquí hay un ejemplo con pasar un entero (compilar y trabajar como se espera en gcc 4.6):

void foo(int &i) {
    /** do something with i **/
    std::cout << i << std::endl;
}

int k = 10;
std::thread t(foo, k);

Pero cuando intento pasar un o'stream no 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);

¿Hay una manera de hacer precisamente eso, o no es posible en absoluto ??

NB: del error de compilación parece provenir de un constructor eliminado...

1 answers

Hilos copia sus argumentos (piénsalo, eso Es Lo Correcto). Si desea una referencia explícitamente, debe envolverla con std::ref (o std::cref para referencias constantes):

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

(La envoltura de referencia es una envoltura con semántica de valores alrededor de una referencia. Es decir, puedecopiar la envoltura, y todas las copias contendrán la misma referencia.)

Como de costumbre, este código solo es correcto mientras el objeto al que se refiere permanezca vivo. Advertencia emptor.

 47
Author: Kerrek SB,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-11-28 17:11:01