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

时间:2013-04-21 14:37:15

标签: c++ function segmentation-fault

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

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',换句话说,引用变量现在超出了范围。但它的工作越少越好

3 个答案:

答案 0 :(得分:3)

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

  • set_dim会返回 l 的副本。临时副本将是 传递给sum

  • sum可以接受临时因为它需要一个const引用和 一切都很顺利,他们都幸福地生活,直到 sum已退回。

答案 1 :(得分:3)

这是明确定义的。 set_dim按值返回,因此其返回的对象是局部变量l的临时副本。然后将此临时值绑定到const的{​​{1}}引用参数。这会影响临时对象的生命周期:

  

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

因此临时对象的生命周期是完整表达式sum。 <{1}}正在执行时它仍然存在。

答案 2 :(得分:1)

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