2017-06-15 90 views
0

我的問題是關於C++中的臨時變量以及如何最好地避免它們的陷阱。C++臨時變量的生存期

在有些情況下,我們做類似下面的內容實例:

SomeFunctionReturningStdString().c_str(); 

其中SomeFunctionReturningStdString()按值返回std::string

我們已經發現,但是這會導致不確定的行爲,並提出了兩個建議,以解決此問題:

std::string temp = SomeFunctionReturningStdString(); 
temp.c_str(); 

..similar在此link指定的解決方案。

或使SomeFunctionReturningStdString()通過引用返回std::string。這樣,如果我的理解是正確的,那麼就不會創建一個臨時對象,因爲我們現在有了對該對象的引用。

這兩個解決方案是否有效?他們都可以避免與臨時變量相關的陷阱嗎?

+2

不幸的是,你的例子被簡化爲不再相關。是的,這裏有一個暫時的,但它足夠長(完整的表達),所以'c_str'調用本身是有效的。返回的'char const *'指針在臨時字符串的同一時刻(final';')過期。 – MSalters

回答

0

這兩種解決方案都有效嗎?

第一個是有效的。

如果返回引用的對象在SomeFunctionReturningStdString()返回後仍然存在,則第二個有效。如果沒有查看SomeFunctionReturningStdString()中的代碼以及它返回引用的對象是如何定義的,則無法判斷這是否爲真。

除非存在性能問題,否則最好使用第一種解決方案。這將更容易理解和維護。

+0

謝謝。是的,我應該更加明確地提到SomeFunctionReturningStdString()確實會返回一個有效的引用。 – user3527596

0

如果您收到一個返回的值,只要它在使用它的單個表達式中就會生存下來。爲了保存它,你必須創建一些類型的變量,它至少有立即封閉塊的範圍來存儲它,並賦值給該變量。我希望這是有道理的。