2011-11-28 26 views
28

He llegado a un problema con la nueva interfaz C++ 11 std::thread. No se puede averiguar cómo pasar una referencia a std::ostream a la función que ejecutará el subproceso¿Por qué no se compila la referencia de los argumentos de referencia del objeto al hilo?

He aquí un ejemplo con el paso de un número entero (compilar y funciona como se espera en virtud de 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 una ostream 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 forma de hacerlo, o no es posible en absoluto?

NB: desde el error de compilación que parece venir de un constructor borrado ...

+0

Para primitivos: http://stackoverflow.com/questions/5116756/difference-between-pointer-and-reference-as-thread-parameter –

Respuesta

44

Hilos copia sus argumentos (pensar en ello, que es lo correcto). Si desea una referencia explícita, hay que envolverlo con std::ref (o std::cref referencias constantes):.

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

(La envoltura de referencia es un envoltorio con la semántica de valor en torno a una referencia que es, puede copia el contenedor, y todas las copias contendrán la misma referencia.)

Como es habitual, este código solo es correcto siempre que el objeto al que se refiere permanezca activo. Caveat Emptor.

+2

¿O posiblemente pasándolo por un puntero? –

+21

@JohnDibling: si eres masoquista y crees que hay demasiado plusplus en tu C, sí. –

+0

Yo tengo tendencias masoquistas, supongo. –

-3
void foo(intstd::ostream &os) 

no se parece a C++ válido para mí.

+7

Me parece válido ... Espacio de nombres inusual: P – AkiRoss

Cuestiones relacionadas