¿Cuál es la diferencia entre boost::ref(i)
y & i
? ¿Cuáles son las situaciones en las que no podemos usar referencias regulares y tenemos que ir por boost::ref
en su lugar? Por favor incluya ejemplos si es posible.Diferencia entre boost :: ref y referencias regulares
Respuesta
Desde el Boost.Ref Documentation:
El propósito de impulso :: reference_wrapper es contienen una referencia a un objeto de tipo T. Se utiliza principalmente para "alimentar" referencias para funcionar plantillas (algoritmos) que toman su parámetro por valor.
NB: Una diferencia importante entre boost::reference_wrapper
y std::reference_wrapper
(al menos de Boost 1.52) es la capacidad de std::reference_wrapper
para envolver perfectamente objetos de función.
Esto permite código como este:
// functor that counts how often it was applied
struct counting_plus {
counting_plus() : applications(0) {}
int applications;
int operator()(const int& x, const int& y)
{ ++applications; return x + y; }
};
std::vector<int> x = {1, 2, 3}, y = {1, 2, 3}, result;
counting_plus f;
std::transform(begin(x), end(x), begin(y),
std::back_inserter(result), std::ref(f));
std::cout << "counting_plus has been applied " << f.applications
<< " times." << '\n';
En Boost.Thread por ejemplo:
un nuevo hilo es lanzado por pasar un objeto de un tipo exigible que puede ser invoca sin parámetros al constructor . El objeto se copia en el almacenamiento interno, y se invoca en el hilo de ejecución recién creado. Si el objeto no debe (o no puede) ser copiado, entonces boost :: ref puede usarse para pasar en una referencia al objeto de la función . En este caso, el usuario de Boost.Thread debe asegurarse de que el objeto referido supera al subproceso recién creado de ejecución.
Código del documento:
struct callable
{
void operator()();
};
boost::thread copies_are_safe()
{
callable x;
return boost::thread(x);
} // x is destroyed, but the newly-created thread has a copy, so this is OK
boost::thread oops()
{
callable x;
return boost::thread(boost::ref(x));
} // x is destroyed, but the newly-created thread still has a reference
// this leads to undefined behaviour
- 1. Diferencia entre 'const ref' y 'in'?
- 2. Diferencia entre * y + expresiones regulares
- 3. diferencia entre las referencias y punteros
- 4. diferencia entre pthread_spinlock y boost :: smart_ptr :: spinlock?
- 5. ¿Cuál es la diferencia entre referencias y objetos en Java?
- 6. Diferencia entre restricción de clave externa y referencias en Rails
- 7. Diferencia entre los modificadores de expresiones regulares 'm' y 's'?
- 8. diferencia entre \ w y \ b metaleros de expresiones regulares
- 9. ¿Cuál es la diferencia entre boost :: io_service poll_one y run_one?
- 10. ¿Cuál es la diferencia entre boost :: multi_array vistas y subarrays
- 11. diferencia entre ARC y MRC
- 12. ¿Cuál es la diferencia entre Boost :: bind y Boost Phoenix :: bind?
- 13. ¿Cuál es la diferencia entre boost :: bind y boost :: lambda :: bind?
- 14. ¿Por qué la diferencia entre las expresiones regulares de .NET y las expresiones regulares de Visual Studio?
- 15. Rendimiento de expresiones regulares: Boost vs. Perl
- 16. diferencia entre Interlocked.Exchange y Volatile.Write?
- 17. Boost libs building - diferencia entre runtime-link y opciones de enlace
- 18. diferencia entre -lgcc_s y gcc
- 19. C++ de referencias entre un puntero a
- 20. Expresiones regulares y Unicode en Python: diferencia entre sub y findall
- 21. C++ expresiones regulares con Boost Regex
- 22. MySQL: diferencia entre ', `,' y"
- 23. Diferencia entre objeto y *?
- 24. Diferencia entre. y #
- 25. ¿Diferencia entre == y caso?
- 26. La diferencia entre $ * y $ @
- 27. Diferencia entre & y &
- 28. VBA: Diferencia entre y y +
- 29. expresiones regulares entre mayúsculas y minúsculas
- 30. Interoperabilidad entre boost :: date_time y std :: chrono
@Venkat Shiva: La situación es "Cuando algoritmos necesitan tomar su parámetro de valor" y no quiere incurrir en la penalización en el rendimiento de pasar un objeto por valor . –
Supongo que debería leer la documentación correctamente antes de publicar las preguntas. Lo siento por la molestia. –