2016-07-13 32 views
8

我想知道標準對下面的代碼片段所說的內容。在致電printPointer之前,是否可以執行臨時對象的析構函數string函數調用中的隱式析構函數執行

p.s. VS2010編譯器不會抱怨這段代碼並且工作正常。

void printPointer(const string* pointer) 
{ 
    cout << *pointer << endl; 
} 

const string* func(const string& s1) 
{ 
    return &s1; 
} 

int main() 
{ 
    printPointer(func("Hello, World!!!")); 
} 
+4

臨時字符串僅破壞在聲明的結尾。有人可能會挖掘參考(有序列點的東西?),但你可以自己看看:http://ideone.com/N3Brll – CompuChip

回答

9

可以string在調用printPointer之前執行臨時對象的析構函數嗎?

沒有,因爲臨時對象將被銷燬在評價充分表達其中包含了他們所創造的點,這意味着它會一直持續到的printPointer()端調用的最後一步。

從標準#12.2/4 Temporary objects [class.temporary]

臨時對象被銷燬作爲評價全表達的最後一步([intro.execution]),該(詞法)包含在其中創建它們的點。

而且#12.2/6 Temporary objects [class.temporary]

在一個函數調用([expr.call])綁定到一個基準參數的臨時對象,持續直到包含該呼叫的全表達的完成。

explanatory demo

-6

你的字符串不被破壞,直到節目結束,如s1是對它的引用(因此,它不是在func破壞)。 Func沒有按值或按值返回。這段代碼沒有問題。

+4

他的字符串在'printPointer'調用後被銷燬。只是因爲有一個引用它並不意味着它不會被破壞。 –

+0

通過你的邏輯,替換'printPointer(func(「Hello,World !!!」));'by'string * s = func(「Hello,World !!!」); printPointer(s);'也應該是有效的? – CompuChip