[解決済み] メンバ関数内のラムダ捕捉リストでメンバ変数を使用する
2022-04-21 08:14:05
質問
以下のコードは gcc 4.5.1 でコンパイルされますが、VS2010 SP1 ではコンパイルされません。
#include <iostream>
#include <vector>
#include <map>
#include <utility>
#include <set>
#include <algorithm>
using namespace std;
class puzzle
{
vector<vector<int>> grid;
map<int,set<int>> groups;
public:
int member_function();
};
int puzzle::member_function()
{
int i;
for_each(groups.cbegin(),groups.cend(),[grid,&i](pair<int,set<int>> group){
i++;
cout<<i<<endl;
});
}
int main()
{
return 0;
}
これはエラーです。
error C3480: 'puzzle::grid': a lambda capture variable must be from an enclosing function scope
warning C4573: the usage of 'puzzle::grid' requires the compiler to capture 'this' but the current default capture mode does not allow it
だから
1> どのコンパイラが正しいのでしょうか?
2> VS2010でラムダ内でメンバ変数を使用するにはどうしたらよいですか?
どのように解決するのですか?
今回はVS2010が正しいと思っているので、標準が手元にあれば確認するのですが、現状ではありません。
さて、エラーメッセージに書いてある通りです。ラムダを囲むスコープの外側にあるものをキャプチャすることはできません。
†
grid
は包含するスコープにないのですが
this
は、(すべてのアクセスは
grid
として実際に発生します。
this->grid
をメンバー関数で使用することができます)。あなたの使用例では
this
をコピーする必要はありません。
grid
auto lambda = [this](){ std::cout << grid[0][0] << "\n"; }
しかし、グリッドを保存し、後でアクセスできるようにコピーしたい場合、あなたの
puzzle
オブジェクトがすでに破壊されている可能性があるため、中間的なローカルコピーを作成する必要があります。
vector<vector<int> > tmp(grid);
auto lambda = [tmp](){}; // capture the local copy per copy
詳細は§5.1.2 をご覧ください。
関連
-
[解決済み】C++ - 解放されるポインタが割り当てられていないエラー
-
[解決済み】致命的なエラー LNK1169: ゲームプログラミングで1つ以上の多重定義されたシンボルが発見された
-
[解決済み】エラー:free(): 次のサイズが無効です(fast)。
-
[解決済み] リスト内包とラムダ+フィルタの比較
-
[解決済み] ラムダ(関数)とは何ですか?
-
[解決済み】ラムダ関数のクロージャは何を捕捉するのか?
-
[解決済み】C++11のラムダは、なぜデフォルトでcapture-by-valueに "mutable "キーワードを要求するのでしょうか?
-
[解決済み】キャプチャしたラムダを関数ポインタとして渡す
-
[解決済み】ラムダ・キャプチャをconst参照にする?
-
[解決済み】Java 8 Lambda関数が例外を投げる?
最新
-
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++ 非推奨の文字列定数から「char*」への変換について
-
[解決済み】C++でユーザー入力を待つ【重複あり
-
[解決済み] string does not name a type Errorが発生するのはなぜですか?
-
[解決済み】「corrupted size vs. prev_size」glibc エラーを理解する。
-
[解決済み】Visual Studio 2013および2015でC++コンパイラーエラーC2280「削除された関数を参照しようとした」が発生する
-
[解決済み】エラー:free(): 次のサイズが無効です(fast)。
-
[解決済み】標準ライブラリにstd::endlに相当するタブはあるか?
-
[解決済み] gdbを使用してもデバッグシンボルが見つからない
-
[解決済み】VC++の致命的なエラーLNK1168:書き込みのためにfilename.exeを開くことができません。
-
[解決済み】デバッグアサーションに失敗しました