下面的代码会导致分段错误吗?
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',换句话说,引用变量现在超出了范围。但它的工作越少越好
答案 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错误的可能性。