1

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

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”,换句话说,对现在超出范围的变量的引用。但它的工作量永远不会减少

4

3 回答 3

3

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

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

  • sum可以接受一个临时的,因为它需要一个 const 引用,一切都很好,他们都过着幸福的生活,直到 sum返回。

于 2013-04-21T14:39:43.523 回答
3

这是很好定义的。set_dim按值返回,因此它的返回对象是局部变量的临时副本l。然后将此临时值绑定到 的const引用参数sum。这会影响临时对象的生命周期:

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

所以临时对象的生命周期是 full-expression cout<<sum(set_dim(5))<<endl;。它在执行时仍然存在sum

于 2013-04-21T14:40:09.283 回答
1

set_dim不返回引用而是 l 的副本,所以我不认为有任何段错误的机会。

于 2013-04-21T14:43:09.460 回答