1. ホーム
  2. c++

[解決済み] C++でテンポラリの寿命は保証されるのか?

2022-12-04 05:35:14

質問

C++は、関数呼び出しの中で作成され、パラメータとして使用されない一時的な変数の寿命について保証していますか? 以下はクラスの例です。

class StringBuffer
{
public:
    StringBuffer(std::string & str) : m_str(str)
    {
        m_buffer.push_back(0);
    }
    ~StringBuffer()
    {
        m_str = &m_buffer[0];
    }
    char * Size(int maxlength)
    {
        m_buffer.resize(maxlength + 1, 0);
        return &m_buffer[0];
    }
private:
    std::string & m_str;
    std::vector<char> m_buffer;
};

そして、その使い方はこうです。

// this is from a crusty old API that can't be changed
void GetString(char * str, int maxlength);

std::string mystring;
GetString(StringBuffer(mystring).Size(MAXLEN), MAXLEN);

一時的なStringBufferオブジェクトのデストラクタはいつ呼び出されるのでしょうか? それは

  • GetStringの呼び出しの前ですか?
  • GetString が返された後か?
  • コンパイラに依存しますか?

C++は、ローカル一時変数がそれへの参照がある限り有効であることを保証していることを知っています。これは、メンバー変数への参照がある場合、親オブジェクトにも適用されますか?

ありがとうございます。

どのように解決するのですか?

その種のテンポラリのデストラクタは、完全な式の最後で呼び出されます。それは他のどの式にも属さない最も外側の式です。あなたの場合は、関数が戻り、値が評価された後です。だから、それはすべての素晴らしい動作になります。

これは実際、式テンプレートを機能させるものです。のような式で、その種のテンポラリーへの参照を保持し続けることができます。

e = a + b * c / d

なぜなら、すべての一時的なものは、式

x = y

は完全に評価されます。かなり簡潔に記述されているのは 12.2 Temporary objects に記載されています。