Вызывает ли следующий код какой-либо тип определенного или неопределенного поведения? Я не уверен, как взаимодействие со ссылкой работает и мой Google/SO поиски идут пустыми:Назначение ссылочного аргумента локальной переменной
struct S {
int i;
};
void Fn(S& s_arg) {
S s_fn{s_arg.i+1};
s_arg = s_fn;
}
int main(int argc, char** argv) {
S s_main{15};
Fn(s_main);
return 0;
}
Я не уверен, какой из двух должно произойти, когда назначение происходит в Fn:
- копия оператор присваивания по умолчанию s вызывается
s_main
(являющийся мишеньюs_arg
ссылки), копирование данных из локального (вFn
)s_fn
вmain
«s местныйs_main
(черезs_arg
ссылки, делая все, что собственно и мы LL определены. - Ссылка сама назначена и теперь относится к
Fn
местнымs_fn
.Fn
теперь возвращает ссылку на локальные данные, и программа теперь просто ждет вызова другой функции сmain
, переписываяFn
локальныйs_fn
и вызывая общий хаос.
А, это то, что я получаю от обработки ссылок как прославленных указателей, я полагаю. Я предполагаю, что причина, по которой они не могут указывать на другой регион в памяти, состоит в том, что, поскольку в этом случае любое присвоение ссылки всегда вызывает оператор присваивания объекта, на который ссылается? – user2555367
@ user2555367: Лучше думать о ссылках как псевдоним (другое имя), а не о указателях. –