Код ниже компилируется и работает просто отлично. Как раз тогда, когда я подумал, что начинаю хорошо понимать ссылку на rvalue и std :: forward — этот очень простой код обнаруживает, что в rvalue есть нечто фундаментальное, чего я не понимаю. Просьба уточнить.
#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 = c ++ 11 test.cpp
Выход:
п = 42
п = 43
Моя главная проблема — где компилятор хранит ‘n’ внутри функции fn?
Я могу рассказать некоторые детали того, что происходит здесь на низком уровне.
Временная переменная типа int
создается в стеке
main
, Это назначено со значением 42.
Адрес временного передается fn
,
fn
пишет 43 по этому адресу, изменяя значение временного.
Функция завершается, временное умирает в конце полного выражения, включающего вызов.
Занимает свой адрес, т.е. &п, и вы увидите его значение указателя.
Вы можете вставить локальную переменную в вашу функцию, а также в main, взять их адреса и посмотреть, где это, но полагаться на любое сравнение между ними было бы неопределенным поведением.
То, что int не является const, правильно, ваша функция получает его. Таким же образом вы можете инициализировать класс коллекцией, используя ссылку на r-значение, а затем класс может изменить его позже, то есть он не обязательно должен быть константным членом. Однако не будет копии.
«Перемещенный» объект по стандарту будет находиться в стабильном и пригодном для использования состоянии, но фактическое значение, которое он содержит, не определено.