Que se requiera un std::ref()
explícito (o boost::ref()
) en estas situaciones es en realidad una característica de seguridad muy útil ya que pasar una referencia puede ser por naturaleza algo peligroso de hacer.
Con una referencia no constante, con frecuencia existe el peligro de que esté pasando una variable local, con una referencia constante podría ser temporal, y cuando está creando una función para llamar en un hilo diferente (y con bind en general, a menudo una función que se llamará más tarde/de forma asíncrona), tendrá el gran peligro de que el objeto ya no sea válido.
La vinculación se ve ordenada, pero estos errores son los más difíciles de encontrar, ya que el error se detecta (es decir, al invocar la función) no es el mismo lugar donde se cometió el error (en el momento del enlace) y puede ser es muy difícil calcular exactamente qué función se está llamando en ese momento y, por lo tanto, dónde estaba enlazada.
Es seguro en su instancia cuando se une al hilo en el ámbito de la variable que está pasando como referencia. Por lo tanto, cuando sabe que ese es el caso, hay un mecanismo para pasar una referencia.
No es una característica del lenguaje que me gustaría ver modificada, sobre todo porque es probable que exista una gran cantidad de código existente que confía en él haciendo una copia que se rompería si solo tomara como referencia automáticamente (y luego necesitaría una forma explícita de forzar una copia).
Respuesta correcta. Upvoted. –
Esto realmente me ayudó, gracias +1. Si alguien nota aún este mensaje, le pregunto por qué 'thread' utiliza este mecanismo. Tiene algo que ver con c, o tiene una razón completamente diferente? – patrik
@patrik La semántica del valor (copia) es segura en comparación con el almacenamiento de una referencia o un puntero. La referencia o un puntero pueden quedar colgando cuando el objeto al que se refieren se destruye. Esta es la razón por la cual los argumentos de la tienda 'std :: bind' y' std :: thread' están por valor de forma predeterminada y tienes que pedirle explícitamente que haga algo menos seguro. –