将引用参数分配给本地变量

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

3

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


啊,我把引用当成了光荣指针,这就是我的下场吧。我猜测它们不能指向内存中的另一个区域的原因是,因为像这种情况下,对引用的任何赋值都会调用被引用对象的赋值运算符? - user2555367
@user2555367:最好将引用视为别名(另一个名称),而不是指针。 - Martin York

3

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


2

C++引用不能被重新指向到一个不同的对象,这就排除了你提出的可能性#2。代码是正确的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接