以下代码是否会调用任何类型的实现定义或未定义的行为?我不确定与引用的交互是如何工作的,我的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_main
(作为s_arg
引用的目标)上调用S的默认复制赋值运算符,从本地复制数据(到Fn
){{1}进入s_fn
的本地main
(通过s_main
引用,使一切正常且定义明确。s_arg
的本地Fn
。 s_fn
现在返回对本地数据的引用,现在程序正在等待从Fn
调用另一个函数,覆盖main
的本地Fn
并导致一般混乱。答案 0 :(得分:3)
这里没有UB,引用指向s_main,你将s_fn的值赋给s_arg(指向s_main),一切都很好。请记住,初始化后的引用(与指针不同)不能指向内存中的另一个区域,这意味着您提到的第二种情况不会发生。
答案 1 :(得分:3)
引用(与指针不同)不能改变它们的“地址”。因此,调用赋值运算符。
答案 2 :(得分:2)
C ++引用不能“重新设置”或用于引用与最初不同的对象。这排除了你的可能性#2。代码没问题。