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

Assigning reference argument to local variable

本文关键字:局部变量 分配 参数 引用      更新时间:2023-10-16

以下代码是否调用任何类型的已定义或未定义的实现行为?我不确定与参考的交互是如何工作的,我的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的默认复制分配运算符在s_mains_arg引用的目标)上调用,将数据从本地(到Fns_fn复制到main的本地s_main(通过s_arg引用),使所有内容都正确且定义良好
  2. 引用本身已分配,现在引用Fn的本地s_fnFn现在正在返回对本地数据的引用,而程序现在只是在等待从main调用另一个函数,从而覆盖Fn的本地s_fn,并造成总体混乱

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

引用(与指针不同)的"地址"不能更改。因此,将调用赋值运算符。

C++引用不能"重新定位"或使其引用与最初不同的对象。这排除了你的可能性#2。代码正常。