2012-01-26 32 views
5

讓我們來看看這兩個功能:如果沒有const引用它,是否會刪除臨時對象?

std::string get_string() 
{ 
    std::string ret_value; 
    // Calculate ret_value ... 
    return ret_value; 
} 

void process_c_string(const char* s) 
{ 
    std::cout << s << endl; 
} 

這裏是process_c_stringget_string返回參數兩種可能的調用。

  1. 沒有綁定const引用返回的對象get_string

    process_c_string(get_string().c_str()); 
    
  2. 隨着常量引用的get_string返回的對象綁定。

    const std::string& tmp_str = get_string(); 
    process_c_string(tmp_str.c_str()); 
    

我知道,第二個方法是有效的,但對於第一個,是什麼標準說的這種情況? get_string返回的臨時對象會在process_c_str之前被刪除,因爲它沒有const reference嗎?

注意:這兩個版本都可以在MSVC中。

回答

6

臨時的生命週期延伸到創建它的完整表達式的長度。在你的情況下,臨時將被銷燬,但只有在撥打process_c_string後才能完成。只要該函數不存儲指針供以後使用,就沒問題。

在第二種情況下(引用的綁定),該臨時的生命週期被擴展爲引用的範圍,但在這種情況下,我會建議針對該模式。通過創建一個使用臨時對象初始化的本地字符串,代碼更簡單,您將獲得相同的效果。 (從性能角度來看,所有編譯器都會隱藏代碼中的潛在額外副本,所以成本將相同)

相關問題