En teoría los que no tienen referencia pueden ser copiados en memoria ya que existe la posibilidad de que su función en línea pueda modificarlos (incluso si no lo hace).
En muchos casos, el compilador es lo suficientemente inteligente como para elegir ese tipo de cosas, pero dependerá del compilador y de la configuración de optimización. Además, si su función llama a cualquier función miembro no const en las variables de clase, entonces su compilador tendrá que ser lo suficientemente inteligente como para comprobar si también están modificando algo.
Al usar una referencia constante, básicamente puede darle una indicación bastante clara.
EDITAR: Acabo de ver el código de máquina para un simple test program compilado con GCC 4.6 en ddd. El código generado parecía idéntico, por lo que parece estar optimizado. Sin embargo, sigue siendo una buena práctica para otros compiladores y, si nada más da una indicación clara de la intención del código. También es posible que existan situaciones más complejas que el compilador no puede optimizar.
También el llvm online dissembler demo muestra idéntico código de bits generado allí también. Si desactiva la optimización, es un poco más larga sin la referencia constante.
* 1964 bytes - Sin referencia de referencias (y ninguna otra depende de las funciones/parámetros)
* 1960 bytes - Simplemente no referencia const pero otras consts.
* 1856 bytes - Con consts y referencia constante.
Un valor es un valor y una referencia es una referencia.Pasar una referencia constante cuando en su lugar se está pasando un valor es un error que puede afectar negativamente. Consulte http://stackoverflow.com/questions/4705593/int-vs-const-int/4705871#4705871 – 6502
@ 6502: ese es un gran ejemplo de un caso en el que el uso de una referencia complica la lógica ('v.push_back (v [0]) 'es legal, porque la biblioteca estándar debe incluir esa lógica extra). –
@BenVoigt: Es bueno ver que esta solicitud se ha agregado a la norma. ¿Dónde está declarado? – 6502