Изменение значения ссылки 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.