2013-04-21 92 views
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」的,換句話說,以變量的引用,現在超出範圍。但從來沒有更少的工作

+0

什麼參考?你只是按價值返回一個結構。 – 2013-04-21 14:40:04

回答

3

這是明確的。 set_dim按值返回,因此其返回的對象是局部變量l的臨時副本。然後該臨時綁定的const參考參數sum。這會影響臨時對象的生命週期:

臨時綁定到函數調用(5.2.2)中的引用參數,直到完成包含調用的完整表達式。

因此臨時對象的生命週期是全表達式cout<<sum(set_dim(5))<<endl;。在執行sum時,它仍然存在。

3

l的參考從未採取(不直接可能是由於間接返回值優化,但你不必擔心那)。

  • set_dim返回l一個副本。將臨時副本 傳遞給sum

  • sum可以接受暫時的,因爲它需要一個const引用和 一切工作就好了,他們都過着幸福快樂,直到 sum返回。

1

set_dim不會返回參考,而是l的副本,所以我不認爲有任何seg故障的可能性。