臨時人員的一生下面的代碼工作正常,但為什么這是正確的代碼?為什么foo()返回的臨時指針“c_str()”有效?我想,輸入bar()時,這個臨時的部分已經被銷毀了-但是它似乎不是這樣的。那么,現在我假設foo()返回的臨時數據將在調用bar()之后銷毀-這是正確的嗎?為什么?std::string foo() {
std::string out = something...;
return out;}void bar( const char* ccp ) {
// do something with the string..}bar( foo().c_str() );
2 回答

白衣非少年
TA貢獻1155條經驗 獲得超0個贊
$12.2/3-“臨時對象被銷毀,作為評估完整表達式(1.9)的最后一步,這個表達式(在詞匯上)包含創建它們的點,即使該評估以拋出異常結束也是如此?!?/trans>
$1.9/12-“一個完整表達式不是另一個表達式的子表達式,如果一個語言結構被定義為產生一個函數的隱式調用,那么就這個定義而言,語言結構的使用被認為是一個表達式。”

阿晨1998
TA貢獻2037條經驗 獲得超6個贊
當在詞匯上包含其計算結果所創建的臨時對象的rvalue的完整表達式被完全計算時,臨時對象將被銷毀。讓我用ASCII的藝術來演示:
____________________ full-expression ranges from 'b' to last ')'
bar( foo().c_str() );
^^^^^ ^
| |
birth funeral
- 2 回答
- 0 關注
- 439 瀏覽
添加回答
舉報
0/150
提交
取消