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

时间:2013-07-06 01:51:14

标签: 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;
}

我不确定在Fn中发生赋值时应该发生哪两个:

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

3 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:3)

引用(与指针不同)不能改变它们的“地址”。因此,调用赋值运算符。

答案 2 :(得分:2)

C ++引用不能“重新设置”或用于引用与最初不同的对象。这排除了你的可能性#2。代码没问题。