Я сбив с толку, как работает следующая программа. Я возвращаю ссылку на локальную переменную из функции, а ссылке присваивается значение более одного раза. Я бы ожидал, что компилятор выкинет ошибку для задания ссылки.
#include <iostream>
using namespace std;
int& getNum()
{
int myNum = 89;
return myNum;
}
int& getAnotherNum()
{
int myNum = 1000;
return myNum;
}
int main()
{
int& Value1 = getAnotherNum();
cout << "Value1 value is: " << Value1 << endl;
Value1 = getNum();
cout << "Value1 value is: " << Value1 << endl;
return 0;
}
Это неопределенное поведение. Согласно п. 1.3.24 неопределенное поведение описывается как:
поведение, для которого настоящий международный стандарт не предъявляет никаких требований
Вопреки распространенному мнению, это не означает, что он всегда будет вызывать ошибку. Стандарт просто не предъявляет никаких требований.
Почему он разрешил "Value1 = getNum();". Значение1 является ссылкой, уже присвоенной чему-то.
Потому что в:
Value1 = getNum();
вы не переназначаете ссылку. Вы вызываете operator=
на int
который копировали значение возвращаемого значения getNum
на Value1
.