2016-03-01 69 views
1

我被告知這個功能有問題,但是在做了研究並嘗試自己使用它之後,我似乎無法找到它的問題。有人只是想惹我嗎?這個功能的問題

std::string foo() throw() 
{ 
    std::string s("hello world"); 
    return s; 
} 
+0

什麼是你跟錯了...?有返回值優化和複製elision的可能性,但這就是我所看到的。 – callyalater

+0

@callyalater這個和'throw'被許多人認爲是不好的做法,但除此之外這是完全沒有問題的, –

+0

除了'throw()'被棄用,我什麼都看不到。 –

回答

7

根據您的編譯器設置,std::string可以從它的構造,如果後盾內存字符串內容的分配失敗時拋出。這會違反你放置的throw()條款。

否則,代碼是好的,但當然也可以縮短:

std::string foo() 
{ 
    return "hello world"; 
} 
+0

這就是我的想法,但我的教授一直暗示它有什麼問題。謝謝 –

+0

如果有的話,你會希望函數指示它正在返回一個'const'值,用這個方法,因爲試圖修改這個''hello world''不會很好玩。 – TezlaCoil

+1

@user:但它沒有返回一個const對象。 'std :: string'創建一個新的可完全修改的字符串,其中包含常量字符串的副本。每個'std :: string'完全包含它所擁有的堆的緩衝區中的內容;沒有'std :: string'引用任何其他人擁有的內存,包括其他'std :: string's(至少,它不允許出現這樣做 - 一些STL實現有寫時複製'std :: string',但它等於相同的東西)。 – Cameron