2009-03-19 7 views
6

Quello che succede qui:Cosa succede quando si passa il riferimento al letterale in C++?

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

foo(5.0); 
  1. fa il compilatore a creare una variabile anonima e imposta il suo valore a 5,0?
  2. La x fa riferimento a una posizione di memoria nella memoria di sola lettura? Si tratta di un fraseggio strano, lo so ...

Edit: Ho dimenticato la parola chiave const ...

risposta

6

una variabile temporanea è stato creato per questo scopo e di solito è creato sulla pila.

Si potrebbe provare a const_cast, ma è comunque pontless, dal momento che non è più possibile accedere a una variabile una volta che la funzione ritorna.

+0

Questo mi sembra molto inefficiente. Non sarebbe meglio solo creare una posizione di memoria nel segmento di sola lettura con il valore dichiarato e utilizzarlo invece di creare una variabile nello stack? Tutto dietro le quinte, ovviamente ... –

+0

Questo dipende comunque dall'implementazione. E il doppio non è così grande. – sharptooth

+0

La creazione di variabili temporanee vale anche per gli oggetti. Invece di raddoppiare se fosse una classe, allora sarebbe stato creato un oggetto temporaneo e anche il suo costruttore sarebbe stato chiamato. –

1
  1. Che compilatore probabilmente fa creare const letterale, ma non è una variabile.
  2. Un riferimento non const non può puntare a un valore letterale.

    $ g ++ test.cpp test.cpp: In funzione 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 doppia foo (doppia &)'

test.cpp:

#include <iostream> 

using namespace std; 

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

int main() { 
    foo(5.0); 

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

D'altra parte, si potrebbe passare un riferimento letterale a const come segue. 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; 
} 
Problemi correlati