C++: 一時引数の寿命?
2023-10-26 09:11:41
質問
新しいインスタンスを作成する際に
MyClass
のような関数の引数として
class MyClass
{
MyClass(int a);
};
myFunction(MyClass(42));
規格では、デストラクタのタイミングについて何か保証されていますか?
具体的に言うと
myFunction()
?
どのように解決するのですか?
一時的なオブジェクトは、その一部である完全な式の終了時に破棄されます。
完全な式とは、他の式の部分式でない式のことです。通常、これは
;
(または
)
に対して
if
,
while
,
switch
など)文の終わりを表します。あなたの例では、それは関数呼び出しの終わりです。
にバインドすることで、テンポラリーの寿命を延長できることに注意してください。
const
参照にバインドすることで、テンポラリーの寿命を延ばすことができます。そうすることで、その寿命は参照の寿命に延長されます。
MyClass getMyClass();
{
const MyClass& r = getMyClass(); // full expression ends here
...
} // object returned by getMyClass() is destroyed here
返されたオブジェクトを変更する予定がないのであれば、これはコピーコンストラクタの呼び出しを節約する良いトリックです(比較対象は
MyClass obj = getMyClass();
と比べて)、戻り値の最適化が適用されていない場合に、コピーコンストラクタの呼び出しを節約するための良いトリックです。残念ながら、これはあまり知られていません。(C++11 の移動セマンティクスにより、あまり有用でなくなるとは思いますが)。
関連
-
[解決済み】C++ クラスヘッダが含まれているときに「不明な型」があるのはなぜですか?重複
-
[解決済み】Visual Studio 2015で「非標準の構文; '&'を使用してメンバーへのポインターを作成します」エラー
-
[解決済み] 数値定数の前にunqualified-idを付けて、数値を定義することを期待する。
-
[解決済み] to_string は std のメンバーではない、と g++ が言っている (mingw)
-
[解決済み] スタックアロケーションにより初期化されていない値が作成された
-
[解決済み] C++11では、標準化されたメモリモデルが導入されました。その意味するところは?そして、C++プログラミングにどのような影響を与えるのでしょうか?
-
[解決済み] サブクラスへのポインタのdeleteは、ベースクラスのデストラクタを呼び出しますか?
-
[解決済み] C++のデストラクタはいつ呼ばれるのか?
-
[解決済み] std::shared_ptr スレッドセーフの説明
-
[解決済み] C++でテンポラリの寿命は保証されるのか?
最新
-
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++でint型に無限大を設定する
-
[解決済み】getline()が何らかの入力の後に使用されると動作しない 【重複あり
-
[解決済み】LLVMで暗黙のうちに削除されたコピーコンストラクタの呼び出し
-
[解決済み】テンプレートの引数1が無効です(Code::Blocks Win Vista) - テンプレートは使いません。
-
[解決済み] 既に.objで定義されている-二重包含はない
-
[解決済み】「std::operator」で「operator<<」にマッチするものがない。
-
[解決済み】クラステンプレートの使用にはテンプレート引数リストが必要です
-
[解決済み] 非静的データメンバの無効な使用
-
[解決済み】システムが指定されたファイルを見つけられませんでした。