[解決済み] 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
に記載されています。
関連
-
[解決済み】クラステンプレートの引数リストがない
-
[解決済み】C++ - 解放されるポインタが割り当てられていないエラー
-
[解決済み] error: 'ostream' does not name a type.
-
[解決済み】変数 '' を抽象型 '' と宣言できない。
-
[解決済み】C++の余分な資格エラー
-
[解決済み] [Solved] インクルードファイルが開けません。'stdio.h' - Visual Studio Community 2017 - C++ Error
-
[解決済み】1つ以上の多重定義されたシンボルが見つかる
-
[解決済み】 while(cin) と while(cin >> num) の違いは何ですか?)
-
[解決済み] to_string は std のメンバーではない、と g++ が言っている (mingw)
-
[解決済み】警告 - 符号付き整数式と符号なし整数式の比較
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】構造体のベクター初期化について
-
[解決済み】コンストラクターでのエラー:識別子を期待されますか?
-
[解決済み】C++でユーザー入力を待つ【重複あり
-
[解決済み] error: 'if' の前に unqualified-id を期待した。
-
[解決済み] 非常に基本的なC++プログラムの問題 - バイナリ式への無効なオペランド
-
[解決済み】リンカーエラーです。"リンカ入力ファイルはリンクが行われていないため未使用"、そのファイル内の関数への未定義参照
-
[解決済み] 数値定数の前にunqualified-idを付けて、数値を定義することを期待する。
-
[解決済み】 while(cin) と while(cin >> num) の違いは何ですか?)
-
[解決済み】Enterキーを押して続行する
-
[解決済み】c++で.txtファイルから2次元の配列に読み込む