2011-05-23 19 views
6

這能正常工作嗎? (請參閱示例)從函數返回的unique_ptr的作用域是什麼?

unique_ptr<A> source() 
{ 
    return unique_ptr<A>(new A); 
} 


void doSomething(A &a) 
{ 
    // ... 
} 

void test() 
{ 
    doSomething(*source().get()); // unsafe? 
    // When does the returned unique_ptr go out of scope? 
} 

回答

17

從函數返回的A unique_ptr沒有範圍,因爲範圍僅適用於名稱。

在您的示例中,臨時unique_ptr的生存期以分號結尾。 (所以是的,它會正常工作。)一般來說,當一個臨時對象在詞法上包含評估創建的臨時對象的完整評估的右值時被銷燬。

+2

+1表示精確和不透明。 – briantyler 2011-05-23 13:28:03

+0

所以函數doSomething在unique_ptr被銷燬之前執行? – tache 2011-05-23 13:34:42

+2

@tache:是的。對於任何返回值都是如此。如果它立即超出範圍,從函數返回*任何內容都將毫無用處。 :) – jalf 2011-05-23 13:41:44

3

評估「完整表達式」後,臨時值被破壞,該表達式是(大致)最大的封閉表達式 - 在本例中是整個語句。所以它很安全。在doSomething返回後,unique_ptr被銷燬。

+0

Microsoft:「作爲表達式評估結果創建的所有臨時對象在表達式語句(也就是分號)結束時或在控制結束時被銷燬for,if,while,do和switch語句的表達式。「 http://msdn.microsoft.com/en-us/library/a8kfxa78(v=VS.100).aspx – tache 2011-05-23 14:35:29

+1

@tache請參閱C++ 03標準中的1.9/12和12.2/3以獲得權威答案。 – 2011-05-23 16:11:45

+0

@stokes:鏈接?? – tache 2011-05-23 18:53:15

1

應該沒問題。考慮

int Func() 
{ 
    int ret = 5; 

    return ret; 
} 

void doSomething(int a) { ... } 


doSomething(Func()); 

即使你在堆棧上返回ret也沒問題,因爲它在調用範圍內。

+0

但Func()無論如何都會返回ret的副本。所以這個例子與我的想法並不相關。 – tache 2011-05-23 13:54:07

相關問題