【参照環境を持つラムダ式はスコープが外れたらその実行は未定義】
まずはコピーラムダを返してみる
#include <iostream> #include <functional> using namespace std; std::tr1::function<int(int)> foo() { int n = 3; return [n](int i) -> int { return n + i; }; } int main() { cout << foo()(2) << endl; // 5 }
参照ラムダを返してみる(reference_closureがないのでfunctionで返す)
#include <iostream> #include <functional> using namespace std; std::tr1::function<int(int)> foo() { int n = 3; return [&n](int i) -> int { return n + i; }; } int main() { cout << foo()(2) << endl; // -858993458 }
おーけーおーけー
#include <vector> #include <functional> using namespace std; using namespace std::tr1; int main() { vector<function<void()>> v; v.push_back([]{}); v.push_back([]{}); } // ここで落ちる
バグだー。
【ラムダ式からメンバ関数を呼び出してみる】
メンバ関数内のラムダ式はそのクラスの friend と見なされるので private メンバを呼ぶことができます。
それと、メンバ関数を呼ぶには this をキャプチャします。
#include <iostream> using namespace std; class hoge { void private_member() const { cout << "call private" << endl; } public: void call() const { [this]{ private_member(); }(); } }; int main() { hoge().call(); // call private }
#include <iostream> #include <vector> #include <algorithm> using namespace std; using namespace std::tr1; class hoge { vector<int> vec_; void disp(int i) const { cout << i << endl; } public: hoge() { vec_.push_back(3); vec_.push_back(1); vec_.push_back(4); } void call() const { for_each(vec_.begin(), vec_.end(), [this](int i){ disp(i); }); } }; int main() { hoge().call(); }
メンバ関数呼ぶのがだいぶラクになったなー。
#include <cliext/vector> #include <cliext/algorithm> using namespace cliext; int main() { vector<int> v; v.push_back(3); v.push_back(1); v.push_back(4); for_each(v.begin(), v.end(), [](int x){ System::Console::WriteLine(x); }); }
3 1 4
ふつーに動いた
ラムダ式はもう慣れた。