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 的默认复制赋值运算符在s_main(作为s_arg引用的目标)上调用,将数据从本地(到Fn)复制s_fnmain本地s_main(通过s_arg引用,使一切正确且定义明确。
  2. 引用本身已分配,现在引用Fn's local s_fnFn现在正在返回对本地数据的引用,程序现在只是在等待从 调用另一个函数main,覆盖Fn本地s_fn并造成一般混乱。
4

3 回答 3

3

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

于 2013-07-06T01:56:05.980 回答
3

引用(与指针不同)不能更改其“地址”。因此,调用了赋值运算符。

于 2013-07-06T01:56:37.833 回答
2

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

于 2013-07-06T01:56:25.420 回答