以下代码是否调用任何类型的实现定义或未定义的行为?我不确定与引用的交互是如何工作的,我的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中的赋值发生时,我不确定哪两个应该出现:
s_main(作为s_arg引用的目标),将数据从本地(to Fn)复制s_fn到main本地s_main(通过s_arg引用,使一切正常并且定义良好).Fn本地s_fn.Fn现在正在返回对本地数据的引用,程序现在正在等待从其中调用另一个函数main,覆盖Fn本地s_fn并导致一般混乱.这里没有 UB,引用指向 s_main,并且您将 s_fn 的值分配给 s_arg(指向 s_main),一切都很好。请记住,引用(与指针不同)一旦初始化就不能指向内存中的另一个区域,这意味着您提到的第二种情况不会发生。