C++ 将引用参数赋值给局部变量

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中分

以下代码是否调用任何类型的实现定义或未定义的行为?我不确定与引用的交互是如何工作的,我的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
    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:最好将引用视为别名(另一个名称),而不是指针。