2009-03-19 14 views
6

lo que sucede aquí:¿Qué sucede cuando se pasa la referencia al literal en C++?

double foo(const double& x) { 
    // do stuff with x 
} 

foo(5.0); 
  1. ¿El compilador de crear una variable anónima y establece su valor a 5.0?
  2. ¿La x hace referencia a una ubicación de memoria en la memoria de solo lectura? Se trata de un fraseo raro, lo sé ...

edición: He olvidado la palabra clave const ...

Respuesta

6

Se crea una variable temporal para este propósito y por lo general es creado en la pila.

Puede intentar const_cast, pero de todos modos es pontless, ya que no puede acceder a una variable una vez que la función vuelve.

+0

Esto me parece muy ineficiente. ¿No sería mejor simplemente crear una ubicación de memoria en el segmento de Solo lectura con el valor declarado y usarla en lugar de crear una variable en la pila? Todo detrás de escena, por supuesto ... –

+0

De todos modos, eso depende de la implementación. Y el doble no es tan grande. – sharptooth

+0

La creación de variables temporales también es válida para objetos. En lugar de duplicar si fuera una clase, se habría creado un objeto temporal y también se habría llamado a su constructor. –

1
  1. Qué compilador probablemente sí crea const literal, pero eso no es una variable.
  2. Una referencia no constante no puede apuntar a un literal.

    $ g ++ test.cpp test.cpp: En función int main()': test.cpp:10: error: invalid initialization of non-const reference of type 'double&' from a temporary of type 'double' test.cpp:5: error: in passing argument 1 of doble foo (doble &)'

test.cpp:

#include <iostream> 

using namespace std; 

double foo(double & x) { 
    x = 1; 
} 

int main() { 
    foo(5.0); 

    cout << "hello, world" << endl; 
    return 0; 
} 

Por otra parte, usted podría pasar un literal a una referencia constante de la siguiente manera. test2.cpp:

#include <iostream> 

using namespace std; 

double foo(const double & x) { 
    cout << x << endl; 
} 

int main() { 
    foo(5.0); 

    cout << "hello, world" << endl; 
    return 0; 
} 
Cuestiones relacionadas