以下代码是否会调用任何类型的实现定义或未定义行为?我不确定与引用的交互是如何工作的,我的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_arg
引用的目标s_main
上调用S的默认复制赋值运算符,将来自Fn
局部变量s_fn
的数据复制到main
的局部变量s_main
中(通过s_arg
引用),使一切正常和定义明确。 - 引用本身被赋值,并且现在引用
Fn
的局部变量s_fn
。现在,Fn
返回对局部数据的引用,程序现在只是等待从main
调用另一个函数,覆盖Fn
的局部变量s_fn
并引起一般混乱。