Ваш fun
дает местоположение из int
(так как он возвращает ссылку ).Этим местоположением является static
переменная x
, которая инициализируется (один раз, концептуально до запуска программы) 10.
Тогда fun() = 30;
означает , назначая это местоположение.Так что x
присваивается 30.
Наконец cout << fun()
отображает содержимое этого местоположения.
Если бы x
была некоторой автоматической переменной , ваш код был быиметь неопределенное поведение .
PS.Грубый способ думать о &
унарной ссылке, такой как int &r = x;
, заключается в том, что она «трансформирует» ваш код следующим образом: введите фантомный указатель int *p = &x;
(где p
- некоторая свежая переменная, не встречающаяся в другом месте) и заменитеr
с *p
, поэтому &r
с p
, повсюду в рамках этого r
.