一時関数の引数はいつ消滅しますか?
C では、一時オブジェクトが関数の引数として作成されると、コンパイラが自動的に寿命を管理します。ここで疑問が生じます: 一時オブジェクトのデストラクターはどの時点で呼び出されることが保証されていますか?
C 標準によれば、一時オブジェクトは、その一部である完全な式の最後に破棄されます。ここで、完全な式とは、別の式の部分式ではない式です。通常、制御フロー ステートメント (if、while、switch など) のセミコロン (;) または閉じ括弧 () で終了します。
提供された例では、
class MyClass { MyClass(int a); }; myFunction(MyClass(42));
関数の引数として作成された一時的な MyClass オブジェクトは、関数呼び出しステートメントの終了後、つまりセミコロンに遭遇したときに破棄されます。したがって、後続のステートメントが実行される前にデストラクターが呼び出されると想定できます。
const 参照を使用して一時変数の有効期間を延長できることは注目に値します。一時オブジェクトを const 参照にバインドすることにより、その有効期間は参照の有効期間と一致するように延長されます。
MyClass getMyClass(); { const MyClass& r = getMyClass(); // full expression ends here ... } // object returned by getMyClass() is destroyed here
この手法により、特に戻り値の最適化の場合に、関数によって返される値を保持しながら、不要なコピー構造を節約できます。は適用されません。ただし、C 11 での移動セマンティクスの出現により、その有用性は若干低下しました。
以上がC の一時関数の引数が破棄されるのはいつですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。