2012-01-26 18 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; 
} 

そして、ここではget_stringによって返された引数とprocess_c_string 2つの可能な呼び出しです。

  1. get_stringの返されたオブジェクトへの参照のバインドなし。 get_stringの返されたオブジェクトへの結合const参照すると

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

私は第二の方法が有効であることを知っているが、最初のものについて、標準は、この場合について何を何を言うのでしょうか? get_stringによって返された一時オブジェクトは、が完了する前に削除されますか?const referenceが存在しないためですか?

注:両方のバージョンはMSVCでokです。

答えて

6

一時的なライフタイムは、それが作成された完全な式の長さに及んでいます。あなたの場合、一時的なものは破棄されますが、process_c_stringの呼び出しが完了した後でなければなりません。関数が後で使用するためにポインタを格納しない限り、あなたは問題ありません。

2番目のケース(参照のバインディング)では、その一時的なライフタイムが参照の範囲に拡張されますが、この特定のケースではそのパターンに対してアドバイスします。一時的に初期化されたローカル文字列を作成することで同じ効果が得られ、コードは簡単です。 (パフォーマンスの観点からは、すべてのコンパイラが潜在的な余分なコピーをコード内に残すため、コストは同じになる)

関連する問題