C++のラムダ式の寿命は?
2023-10-30 16:19:27
質問
(私が読んだのは C++でラムダ由来の暗黙のファンクタの寿命はどのくらいでしょうか? を既に読みましたが、この質問には答えていません)。
C++のラムダ構文は、呼び出し演算子といくつかの状態を持つ匿名クラスのインスタンスを作成するための単なる砂糖であることを理解し、その状態の寿命要件(参照によって値によってキャプチャするかどうかによって決まる)を理解しています。次の例では
std::function
のインスタンスが返されますが、これは役に立つのでしょうか?
std::function<int(int)> meta_add(int x) {
auto add = [x](int y) { return x + y; };
return add;
}
もし、それが
どのように動作するのか
? これはちょっと魔法が多すぎるような気がします。
std::function
がインスタンス全体をコピーすることで動作するとしか考えられず、キャプチャしたものによっては非常に重くなります。
std::function
は主に素の関数ポインタで使っていて、それらのコピーはすぐに終わります。また、以下の点からも問題があると思われます。
std::function
の型消去に照らしても問題があるように思えます。
どのように解決するのですか?
ラムダをハンドロールファンクタに置き換えた場合の寿命は、まさにその通りです。
struct lambda {
lambda(int x) : x(x) { }
int operator ()(int y) { return x + y; }
private:
int x;
};
std::function<int(int)> meta_add(int x) {
lambda add(x);
return add;
}
オブジェクトが作成され、ローカルで
meta_add
関数の値も含め、その内部で移動します。
x
を含む全体] を返り値に移動した場合、ローカルインスタンスはスコープ外に出て、通常通り破壊されます。 しかし、関数から返されるオブジェクトは
std::function
オブジェクトが保持する限り有効です。 それがどれくらいの期間かは、明らかに呼び出し側のコンテキストに依存します。
関連
-
[解決済み】浮動小数点例外エラーが発生する: 8
-
[解決済み】C++ - ステートメントがオーバーロードされた関数のアドレスを解決できない。
-
[解決済み】演算子のオーバーロード C++; <<操作のパラメータが多すぎる
-
[解決済み] explicit キーワードの意味は?
-
[解決済み] ルール・オブ・スリーとは?
-
[解決済み] C++11では、標準化されたメモリモデルが導入されました。その意味するところは?そして、C++プログラミングにどのような影響を与えるのでしょうか?
-
[解決済み] スマートポインターとは何ですか?
-
[解決済み] ムーブセマンティクスとは何ですか?
-
[解決済み】C/C++の"-->"演算子とは何ですか?
-
[解決済み】C++11のラムダ式って何?
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】getline()が何らかの入力の後に使用されると動作しない 【重複あり
-
[解決済み】C++ - 解放されるポインタが割り当てられていないエラー
-
[解決済み】C-stringを使用すると警告が表示される。"ローカル変数に関連するスタックメモリのアドレスが返される"
-
[解決済み】致命的なエラー LNK1169: ゲームプログラミングで1つ以上の多重定義されたシンボルが発見された
-
[解決済み】C++エラーです。"配列は中括弧で囲まれたイニシャライザーで初期化する必要がある"
-
[解決済み] 非常に基本的なC++プログラムの問題 - バイナリ式への無効なオペランド
-
[解決済み】エラー:free(): 次のサイズが無効です(fast)。
-
[解決済み】指定範囲内の乱数で配列を埋める(C++)
-
[解決済み】C++ - 適切なデフォルトコンストラクタがない [重複]。
-
[解決済み] 配列のベクトルを扱う正しい方法