L'adresse de i
ne va jamais changer dans main()
mais la valeur qu'il contient le sera. Vous prenez la référence d'une variable locale et l'utilisez après que cette référence soit sortie de sa portée. (Avertissement de langage imprécis) La valeur 6
est sur la pile. Puisque vous n'avez rien fait avec la pile après avoir mis 6
la référence à ce dernier contiendra toujours la même valeur. Donc, comme d'autres l'ont dit, vous avez eu de la chance.
Pour voir à quel point vous êtes chanceux, essayez d'exécuter ce code qui utilise la pile après avoir appelé foo()
:
#include <iostream>
#include <ctime>
#include <numeric>
int& foo()
{
int i = 6;
std::cout << &i << " = " << i << std::endl; //Prints the address of i before return
return i;
}
long post_foo(int f)
{
srand((unsigned)time(0));
long vals[10] = {0};
size_t num_vals = sizeof(vals)/sizeof(vals[0]);
for( size_t i = 0; i < num_vals; ++i )
{
int r = (rand()%2)+1;
vals[i] = (i+f)*r;
}
long accum = std::accumulate(vals, &vals[num_vals], 0);
return accum * 2;
}
int main()
{
int &i = foo();
// std::cout << "post_foo() = " << post_foo(i) << std::endl;
std::cout << &i << " = " << i << std::endl;
}
Quand je l'ai lancé avec le post_foo()
appel commenté, 6
était toujours sur la pile et la sortie était :
002CF6C8 = 6
002CF6C8 = 6
...mais quand j'ai dé-commenté l'appel à post_foo()
et l'a refait, 6
était parti depuis longtemps :
001FFD38 = 6
post_foo() = 310
001FFD38 = 258923464