¿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.
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