以下代码是否调用任何类型的实现定义或未定义的行为?我不确定与参考的交互是如何工作的,我的 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_main
(通过s_arg
引用,使一切正确且定义明确。 - 引用本身已分配,现在引用
Fn
's locals_fn
。Fn
现在正在返回对本地数据的引用,程序现在只是在等待从 调用另一个函数main
,覆盖Fn
本地s_fn
并造成一般混乱。