2012-06-26 78 views
0
void fn(string &s) 
{ 
    //.... 
} 

//use the function  
fn("helloworld"); 

首先,用const char字符串啓動非const字符串是錯誤的。參考用法

後,我在參數添加常量,它編譯。

但它是正確的對堆棧引用臨時對象字符串(「HelloWorld」的)?

難道確認字符串( 「HelloWorld」 的)被調用?

-

編輯。

如果創建一個臨時字符串,編譯器如何判斷對象的字符串( 「HelloWorld」 的)是的std :: string(爲const char *)的構造常量?

+0

如果你問如果'string'對象將從'爲const char *創建'那麼答案是肯定的,你可以放心地使用你的函數內部的字符串。 – Dennis

+0

創建一個臨時對象:[由構造函數轉換](http://publib.boulder.ibm。COM /信息中心/ comphelp/v8v101/index.jsp的?主題=%2Fcom.ibm.xlcpp8a.doc%2Flanguage%2Fref%2Fcplr384.htm)。當'fn()'返回時,'std :: string'析構函數在對象作用域的末尾被調用。 –

回答

5

但是,在棧上引用臨時對象字符串(「helloworld」)是否正確?

是的,只要引用是const,臨時的生命週期就會延長。

是否確定會調用字符串(「helloworld」)?

是的,使用轉換構造函數std::string(const char*)創建臨時值。但請注意,編譯器可以通過優化這一步。

+0

編譯器如何優化轉換?如果被調用的函數需要一個'std :: string',並且給它一個'char const []',那麼就必須發生一些事情。 –

+0

@JamesKanze如果函數內聯並且什麼都不做,該怎麼辦? –

+0

任何優化都必須根據「如果」規則進行。如果編譯器可以確定程序的可觀察行爲將保持不變,則它可以執行任何操作。在這種情況下,它必須確定在構造函數和析構函數中沒有「不可調用行爲」,它不會調用它。 (理論上,在這種情況下這很簡單:'std :: string'是標準庫的一部分,編譯器可以神奇地知道關於它們的所有信息。據我所知,沒有一個可以,雖然在這種情況下'std :: string',這會很有意義。) –

2

但是,在堆棧上引用臨時對象字符串(「helloworld」)是否正確?

是的,爲什麼不呢?

難道確認字符串( 「HelloWorld」 的)被調用?

可以,只要string提供使用這garuanteed一個const char *參數的隱式構造(std::string這樣做)。

4

但是,在堆棧上引用臨時對象字符串(「helloworld」) 是否正確?

在這種情況下,可能,但您必須注意對象的生命週期。在充分表達結尾時臨時將不復存在;如果fn保存一個指針或引用它,你有麻煩。這通常不是免費功能的問題,例如您的fn(但可以);如果臨時參數是new表達式中的構造函數的參數(但該類的作者應記錄超出構造函數調用的任何生命週期需求),可能會出現問題。

+0

這是一個很好的點,從+1我... –