将引用参数分配给局部变量

use*_*367 5 c++ reference

以下代码是否调用任何类型的实现定义或未定义的行为?我不确定与引用的交互是如何工作的,我的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;
}
Run Code Online (Sandbox Code Playgroud)

当Fn中的赋值发生时,我不确定哪两个应该出现:

  1. 调用S的默认复制赋值运算符s_main(作为s_arg引用的目标),将数据从本地(to Fn)复制s_fnmain本地s_main(通过s_arg引用,使一切正常并且定义良好).
  2. 引用本身已分配,现在引用Fn本地s_fn.Fn现在正在返回对本地数据的引用,程序现在正在等待从其中调用另一个函数main,覆盖Fn本地s_fn并导致一般混乱.

Bor*_*der 3

这里没有 UB,引用指向 s_main,并且您将 s_fn 的值分配给 s_arg(指向 s_main),一切都很好。请记住,引用(与指针不同)一旦初始化就不能指向内存中的另一个区域,这意味着您提到的第二种情况不会发生。