C++ 将引用参数赋值给局部变量
以下代码是否调用任何类型的实现定义或未定义的行为?我不确定与引用的交互是如何工作的,我的Google/SO搜索结果是空的:C++ 将引用参数赋值给局部变量,c++,reference,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中分
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
)S_-Fn
复制到main
的本地S_-main
(通过S_-arg
引用),使所有内容都正确且定义良好Fn
的本地s\u Fn
Fn
正在返回对本地数据的引用,而程序现在正等待从main
调用另一个函数,覆盖Fn
的本地s\u Fn
,并造成一般的混乱这里没有UB,引用指向s_main,您将s_fn的值赋值给s_arg(指向s_main),一切正常。请记住,引用(与指针不同)一旦初始化就不能指向内存中的另一个区域,这意味着您提到的第二种情况不能发生。C++引用不能被删除“重新放置”或使其引用与最初不同的对象。这排除了您的可能性#2.代码正常。引用(与指针不同)不能有其“地址”"更改。因此,调用赋值运算符。Ah,这就是我将引用视为美化指针所得到的结果。我猜它们不能指向内存中的另一个区域的原因是,像这种情况一样,引用的任何赋值都会调用所引用对象的赋值运算符@user2555367:最好将引用视为别名(另一个名称),而不是指针。