5

この 2 つの関数を見てみましょう。

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_stringによって返される引数を使用したの 2 つの可能な呼び出しを次に示しますget_string

  1. の返されたオブジェクトへの const 参照をバインドしない場合get_string

    process_c_string(get_string().c_str());
    
  2. の返されたオブジェクトへのバインディング const 参照を使用しますget_string

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

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

注: MSVC ではどちらのバージョンも問題ありません。

4

1 に答える 1

6

一時の有効期間は、それが作成された完全な式の長さまで延長されます。process_c_stringあなたの場合、一時的なものは破棄されますが、呼び出しが完了した後にのみ破棄されます。関数が後で使用するためにポインターを保存しない限り、問題はありません。

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

于 2012-01-26T13:30:59.880 に答える