c++ - constint - ¿Por qué "const de más importante" tiene que ser const?
const javascript (3)
En http://herbsutter.com/2008/01/01/gotw-88-a-candidate-for-the-most-important-const/ menciona "const. Más importante", donde C ++ especifica deliberadamente que vincula un objeto temporal a una referencia a const en la pila alarga el tiempo de vida del temporal al tiempo de vida de la propia referencia. Me preguntaba por qué c ++ solo permite alargar la vida útil del objeto cuando la referencia es constante y no cuando no lo es. ¿Cuál es la razón detrás de la característica y por qué tiene que ser const?
Aquí hay un ejemplo:
void square(int &x)
{
x = x * x;
}
int main()
{
float f = 3.0f;
square(f);
std::cout << f << ''/n'';
}
Si los temporales pudieran unirse a referencias de valores no constantes, lo anterior compilaría felizmente, pero produciría resultados bastante sorprendentes (una salida de 3
lugar de 9
).
Considera lo siguiente:
int& x = 5;
x = 6;
¿Qué debería pasar si esto estaba permitido? Por el contrario, si lo hiciste
const int& x = 5;
No habría forma legal de modificar x
.
Tenga en cuenta que las referencias const pueden vincularse a objetos que normalmente no tienen una dirección. Un parámetro const int &
function puede tomar un argumento formado por la expresión constante de literal 42
. No podemos tomar la dirección de 42
, por lo que no podemos pasarla a una función que toma const int *
.
Las referencias const son especialmente "bendecidas" para poder enlazar a valores como este.
Por supuesto, para valores tradicionales como 2 + 2
, la vida útil no es un problema. Es un problema para los valores de tipo de clase.
Si se permite la unión de una referencia a algún objeto que, a diferencia de 42
, no tiene una vida útil generalizada, esa vida debe extenderse, de modo que la referencia permanezca sana en todo su alcance.
No es que la constante cause una extensión de por vida, es que una referencia no constante no está permitida. Si eso fuera permitido, también requeriría una extensión de por vida; no tiene sentido permitir alguna referencia, que luego va mal en algunas partes de su alcance. Ese comportamiento socava el concepto de que una referencia es más segura que un puntero.