Hay una diferencia entre los dos. Considere lo siguiente:
#include <iostream>
#include <string>
using std::string;
string g_value;
void callback() {
g_value = "blue";
}
void ProcessStringByRef(const string &s) {
callback();
std::cout << s << "\n";
}
void ProcessStringByValue(const string s) {
callback();
std::cout << s << "\n";
}
int main() {
g_value = "red";
ProcessStringByValue(g_value);
g_value = "red";
ProcessStringByRef(g_value);
}
Salida:
red
blue
El hecho de que una referencia es const dentro de una función, no significa que el referand no se puede modificar a través de otras referencias (la situación de uno el objeto que tiene múltiples referencias o punteros se llama "aliasing"). Por lo tanto, hay una diferencia entre pasar una referencia constante y pasar un valor constante: en el caso de la referencia, el objeto puede cambiar después de que se realiza la llamada. En el caso del valor, el destinatario tiene una copia privada, que no cambiará.
Dado que hacen cosas diferentes, C++ le permite elegir cuál desea.
Existen consecuencias para el rendimiento en ambos sentidos: cuando se pasa por valor, se debe realizar una copia, lo que cuesta. Pero el compilador sabe entonces que solo su función puede tener referencias a esa copia, lo que podría permitir otras optimizaciones. ProcessStringByRef no puede cargar el contenido de la cadena para imprimir hasta que callback()
haya regresado. ProcessStringByValue puede, si el compilador cree que hacerlo es más rápido.
Por lo general, le importa la copia, no el orden de ejecución de las instrucciones, porque generalmente la copia es mucho más cara. Por lo general, pasa por referencia donde sea posible para objetos que no son triviales para copiar. Pero la posibilidad de aliasing a veces tiene consecuencias muy graves para el rendimiento, ya que impide ciertas optimizaciones, incluso aunque no se produzca aliasing. Es por eso que existen "reglas de aliasing estrictas" y la palabra clave restrict
en C99.
Relacionados http://stackoverflow.com/questions/1567138/const-t-arg-vs-t-arg/1567186#1567186 –