为什么没有分段故障?返回的函数值用作参数

No Segmentation fault why? returned function value used as parameter

本文关键字:函数 参数 返回 分段 故障 为什么      更新时间:2023-10-16

下面的代码会导致分段错误吗?

struct Dim {
  int x, y, z;
};
Dim set_dim(int a) {
 Dim l;
 l.x=a;
 l.y=a;
 l.z=a;
 return l;
}
int sum(const Dim &m) {
  int s=m.x+m.y;
  return s;
}
main() {
  cout<<sum(set_dim(5))<<endl;
}

我认为可以,因为引用了set_dim中的局部变量'l',换句话说,引用了现在超出范围的变量。但它的工作原理始终是

这是定义明确的。set_dim按值返回,因此其返回的对象是局部变量l的临时副本。然后,这个临时参数被绑定到sumconst引用参数。这会影响临时对象的生存期:

函数调用(5.2.2(中引用参数的临时绑定将持续存在,直到包含该调用的完整表达式完成为止。

因此,临时对象的生存期是完整的表达式cout<<sum(set_dim(5))<<endl;。当sum正在执行时,它仍然存在。

永远不会引用l(不直接引用可能是由于间接的返回值优化,但您不必担心(。

  • set_dim返回l副本。临时副本传递到CCD_ 10。

  • sum可以接受临时,因为它接受常量引用,并且一切都很顺利,他们都过着幸福的生活,直到返回sum

set_dim不返回引用,而是返回l的副本,所以我认为不存在任何seg错误的可能性。