std::functionをコピーすべきか、それとも常に参照を取ることができるのか?
質問
私のC++アプリケーション(Visual Studio 2010を使用)では、次のようなstd::functionを格納する必要があります。
class MyClass
{
public:
typedef std::function<int(int)> MyFunction;
MyClass (Myfunction &myFunction);
private:
MyFunction m_myFunction; // Should I use this one?
MyFunction &m_myFunction; // Or should I use this one?
};
見ての通り、コンストラクタの中で関数の引数を参照として追加しています。
しかし、私のクラスで関数を格納する最良の方法は何でしょうか?
- std::function は単なる関数ポインターであり、関数の「実行コード」はメモリ内に留まることが保証されているので、関数を参照として格納できますか?
- ラムダが渡され、呼び出し元が戻った場合に備えて、コピーを作成する必要がありますか?
私の直感では、参照(const参照でも)を保存するのは安全だと思います。 私は、コンパイラーがコンパイル時にラムダのコードを生成し、アプリケーションが実行されている間、この実行可能コードを「仮想」メモリに保持することを期待します。 したがって、実行コードは決して「削除」されることはなく、私は安全にそれへの参照を保存することができる。 しかし、これは本当に正しいのでしょうか?
どのように解決すればよいのでしょうか。
<ブロッククオートstd::function は単なる関数ポインタであり、関数の「実行コード」はメモリ上に残ることが保証されているので、関数を参照として格納することはできますか?
std::function
は単なる関数ポインタではありません。これは任意の呼び出し可能なオブジェクトのラッパーであり、そのオブジェクトを格納するために使用されるメモリを管理します。他の型と同様に、参照を格納するのは安全です。
の場合のみ
の場合のみ、参照を保存することが安全です。
参照を保存する正当な理由と、それが有効であり続けることを保証する方法がない限り、値で保存してください。
による受け渡し
const
への参照は安全であり、おそらく値を渡すよりも効率的です。非
const
の参照は一時的なものを渡すことを妨げるので、ユーザーは直接ラムダを渡すことができないので、その結果
bind
を除く他の呼び出し可能なオブジェクト、あるいは
std::function<int(int)>
を除く他の呼び出し可能なオブジェクトです。
関連
-
[解決済み] error: 'ostream' does not name a type.
-
[解決済み】「corrupted size vs. prev_size」glibc エラーを理解する。
-
[解決済み】Visual C++で "Debug Assertion failed "の原因となる行を見つける。
-
[解決済み】クラスのコンストラクタへの未定義参照、.cppファイルの修正も含む
-
[解決済み】 while(cin) と while(cin >> num) の違いは何ですか?)
-
[解決済み】演算子のオーバーロード C++; <<操作のパラメータが多すぎる
-
[解決済み] std::move()とは何ですか?また、どのような場合に使用するのですか?
-
[解決済み] std::stringをintに変換するにはどうしたらいいですか?
-
[解決済み】1つのクラスでメンバ関数を持つジェネリックstd::functionオブジェクトを使用する
-
[解決済み] Constマップ要素へのアクセス
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】識別子 "string "は未定義?
-
[解決済み] error: 'ostream' does not name a type.
-
[解決済み】fpermissiveフラグは何をするのですか?
-
[解決済み】C++プログラムでのコンソールの一時停止
-
[解決済み】Visual Studio 2013および2015でC++コンパイラーエラーC2280「削除された関数を参照しようとした」が発生する
-
[解決済み】リンカーエラーです。"リンカ入力ファイルはリンクが行われていないため未使用"、そのファイル内の関数への未定義参照
-
[解決済み】ファイルから整数を読み込んで配列に格納する C++ 【クローズド
-
[解決済み] [Solved] インクルードファイルが開けません。'stdio.h' - Visual Studio Community 2017 - C++ Error
-
[解決済み】システムが指定されたファイルを見つけられませんでした。
-
[解決済み】c++で.txtファイルから2次元の配列に読み込む