Изменение значения ссылки rvalue - как это работает?

Код ниже компилируется и работает просто отлично. Просто, когда я подумал, что начинаю получать приличное понимание по ссылке rvalue и std:: forward - этот очень простой код обнаруживает, что есть что-то очень фундаментальное в отношении значения, которое я не понимаю. Просьба уточнить.

#include <iostream>
#include <iomanip>
using namespace std;

void fn( int&& n )
{
    cout << "n=" << n << endl;
    n = 43;
    cout << "n=" << n << endl;
}


int main( )
{
    fn( 42 );
}

Я скомпилирую его с g++ 4.7 со следующей командной строкой:
g++ --std = С++ 11 test.cpp

Выход:
п = 42
п = 43

Моя основная проблема заключается в том, где компилятор хранит 'n' в функции fn?

Ответ 1

Я могу рассказать некоторые подробности о том, что происходит здесь на низком уровне.

  • В стеке создается временная переменная типа int main. Он присваивается значением 42.

  • Адрес временного передается fn.

  • fn записывает 43 по этому адресу, изменяя значение временного.

  • Функция завершается, временное умирает в конце полного выражения, включающего вызов.

Ответ 2

принимает свой адрес, т.е. & n, и вы увидите его значение указателя.

Вы можете вставить локальную переменную в свою функцию, а также в основную часть, а также принять их адреса и посмотреть, где это, но полагаться на любое сравнение между ними будет undefined поведение.

То, что int не const, правильно, ваша функция его получает. Точно так же вы можете инициализировать класс с помощью коллекции с помощью ссылки r-value, а затем класс может впоследствии ее модифицировать, то есть не обязательно быть членом-константой. Однако копия не будет.

Объект, который "перемещается", по стандарту будет находиться в стабильном, пригодном для использования состоянии, но фактическое значение, которое оно имеет, составляет undefined.