рд▓рдореНрдмрджрд╛рд╕: C ++ 11 рд╕реЗ C ++ 20 рддрдХред рднрд╛рдЧ 1

рд╢реБрдн рджреЛрдкрд╣рд░, рджреЛрд╕реНрддреЛрдВред рдЖрдЬ рд╣рдордиреЗ рдЖрдкрдХреЗ рд▓рд┐рдП рд▓реЗрдЦ рдХреЗ рдкрд╣рд▓реЗ рднрд╛рдЧ "рд▓реИрдореНрдмреНрдбрд╛рд╕: рд╕реА ++ 11 рд╕реЗ рд╕реА ++ 20" рдХрд╛ рдЕрдиреБрд╡рд╛рдж рддреИрдпрд╛рд░ рдХрд┐рдпрд╛ рд╣реИ ред рдЗрд╕ рд╕рд╛рдордЧреНрд░реА рдХрд╛ рдкреНрд░рдХрд╛рд╢рди рдкрд╛рдареНрдпрдХреНрд░рдо "C ++ рдбреЗрд╡рд▓рдкрд░" рдХреЗ рд▓реЙрдиреНрдЪ рдХреЗ рд╕рд╛рде рдореЗрд▓ рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдордпрдмрджреНрдз рд╣реИ, рдЬреЛ рдХрд▓ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИред

рд▓реИрдореНрдмреНрдбрд╛ рдХреЗ рднрд╛рд╡ C ++ 11 рдореЗрдВ рд╕рдмрд╕реЗ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рдкрд░рд┐рд╡рд░реНрдзрди рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИрдВ рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рдирдИ рднрд╛рд╖рд╛ рдорд╛рдирдХ рдХреЗ рд╕рд╛рде рд╡рд┐рдХрд╕рд┐рдд рд╣реЛрддреЗ рд░рд╣рддреЗ рд╣реИрдВред рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рд╣рдо рдЙрдирдХреЗ рдЗрддрд┐рд╣рд╛рд╕ рдкрд░ рдЬрд╛рдПрдБрдЧреЗ рдФрд░ рдЖрдзреБрдирд┐рдХ C ++ рдХреЗ рдЗрд╕ рдорд╣рддреНрд╡рдкреВрд░реНрдг рднрд╛рдЧ рдХреЗ рд╡рд┐рдХрд╛рд╕ рдХреЛ рджреЗрдЦреЗрдВрдЧреЗред



рджреВрд╕рд░рд╛ рднрд╛рдЧ рдпрд╣рд╛рдБ рдЙрдкрд▓рдмреНрдз рд╣реИ:
рд▓реИрдореНрдмреНрдбрд╛: рд╕реА ++ 11 рд╕реЗ рд╕реА ++ 20, рднрд╛рдЧ 2 рддрдХ

рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐

рдПрдХ рд╕реНрдерд╛рдиреАрдп C ++ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕рдореВрд╣ рдХреА рдмреИрдардХ рдореЗрдВ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд▓реИрдореНрдмреНрдбрд╛ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗ "рдЗрддрд┐рд╣рд╛рд╕" рдкрд░ рдПрдХ рд▓рд╛рдЗрд╡ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рд╕рддреНрд░ рдерд╛ред рдмрд╛рддрдЪреАрдд рдХрд╛ рдиреЗрддреГрддреНрд╡ C ++ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮ рдЯреЙрдорд╛рдЬрд╝ рдХрд╛рдореАрд╕реНрдХреА ( рдереЙрдорд╕ рд▓рд┐рдВрдХреНрдбрд┐рди рдкреНрд░реЛрдлрд╝рд╛рдЗрд▓ рджреЗрдЦреЗрдВ ) рджреНрд╡рд╛рд░рд╛ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдпрд╣рд╛рдБ рдШрдЯрдирд╛ рд╣реИ:

рд▓реИрдореНрдмреНрдбрд╛: C ++ 11 рд╕реЗ C ++ 20 - C ++ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕рдореВрд╣ рдХреНрд░рд╛рдХреЛ

рдореИрдВрдиреЗ рдереЙрдорд╕ рд╕реЗ рдХреЛрдб рд▓реЗрдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ (рдЙрдирдХреА рдЕрдиреБрдорддрд┐ рд╕реЗ!), рдЗрд╕рдХрд╛ рд╡рд░реНрдгрди рдХрд░реЗрдВ рдФрд░ рдПрдХ рдЕрд▓рдЧ рд▓реЗрдЦ рдмрдирд╛рдПрдВред

рд╣рдо C ++ 03 рдФрд░ рдХреЙрдореНрдкреИрдХреНрдЯ рд╕реНрдерд╛рдиреАрдп рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреА рдЦреЛрдЬ рдХрд░рдХреЗ рд╢реБрд░реВ рдХрд░реЗрдВрдЧреЗред рдлрд┐рд░ рд╣рдо C ++ 11 рдФрд░ C ++ 14 рдкрд░ рдЬрд╛рддреЗ рд╣реИрдВред рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЗ рджреВрд╕рд░реЗ рднрд╛рдЧ рдореЗрдВ, рд╣рдо C ++ 17 рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рджреЗрдЦреЗрдВрдЧреЗ рдФрд░ C ++ 20 рдореЗрдВ рдХреНрдпрд╛ рд╣реЛрдЧрд╛, рдЗрд╕ рдкрд░ рднреА рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓рддреЗ рд╣реИрдВред

C ++ 03 рдореЗрдВ рд▓реИрдореНрдмреНрдбрд╛

рд╢реБрд░реБрдЖрдд рд╕реЗ рд╣реА, рдПрд╕рдЯреАрдПрд▓ рдХреЗ std::algorithms , рдЬреИрд╕реЗ std::sort , рдХрд┐рд╕реА рднреА рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рд▓реЗ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рдХрдВрдЯреЗрдирд░ рддрддреНрд╡реЛрдВ рдкрд░ рдХреЙрд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╣рд╛рд▓рд╛рдБрдХрд┐, C ++ 03 рдореЗрдВ, рдпрд╣ рдХреЗрд╡рд▓ рдлрд╝рдВрдХреНрд╢рди рдФрд░ рдлрд╝рдВрдХреНрд╢рдирд▓рд░реНрд╕ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИред

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:

 #include <iostream> #include <algorithm> #include <vector> struct PrintFunctor { void operator()(int x) const { std::cout << x << std::endl; } }; int main() { std::vector<int> v; v.push_back(1); v.push_back(2); std::for_each(v.begin(), v.end(), PrintFunctor()); } 

рд░рдирд┐рдВрдЧ рдХреЛрдб: @Wandbox

рд▓реЗрдХрд┐рди рд╕рдорд╕реНрдпрд╛ рдпрд╣ рдереА рдХрд┐ рдЖрдкрдХреЛ рдПрдХ рдЕрд▓рдЧ рдлрд╝рдВрдХреНрд╢рди рдпрд╛ рдлрд╝рдВрдХреНрдЯрд░ рдХреЛ рдПрдХ рдЕрд▓рдЧ рджрд╛рдпрд░реЗ рдореЗрдВ рд▓рд┐рдЦрдирд╛ рдерд╛, рдФрд░ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЙрд▓ рдХреЗ рджрд╛рдпрд░реЗ рдореЗрдВ рдирд╣реАрдВред

рд╕рдВрднрд╛рд╡рд┐рдд рд╕рдорд╛рдзрд╛рди рдХреЗ рд░реВрдк рдореЗрдВ, рдЖрдк рдПрдХ рд╕реНрдерд╛рдиреАрдп рдлрд╝рдирдХрд╛рд░ рд╡рд░реНрдЧ рд▓рд┐рдЦрдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ - рдЪреВрдВрдХрд┐ C ++ рд╣рдореЗрд╢рд╛ рдЗрд╕ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдпрд╣ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ ...

рдЗрд╕ рдХреЛрдб рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВ:

 int main() { struct PrintFunctor { void operator()(int x) const { std::cout << x << std::endl; } }; std::vector<int> v; v.push_back(1); v.push_back(2); std::for_each(v.begin(), v.end(), PrintFunctor()); } 

рдЗрд╕реЗ -std=c++98 рд╕рд╛рде рд╕рдВрдХрд▓рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ рдФрд░ рдЖрдкрдХреЛ GCC рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рддреНрд░реБрдЯрд┐ рджрд┐рдЦрд╛рдИ рджреЗрдЧреА:

 error: template argument for 'template<class _IIter, class _Funct> _Funct std::for_each(_IIter, _IIter, _Funct)' uses local type 'main()::PrintFunctor' 

рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ, C ++ 98/03 рдореЗрдВ, рдЖрдк рд╕реНрдерд╛рдиреАрдп рдкреНрд░рдХрд╛рд░ рдХреЗ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХрд╛ рдЙрджрд╛рд╣рд░рдг рдирд╣реАрдВ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред
рдЗрди рд╕рднреА рд╕реАрдорд╛рдУрдВ рдХреЗ рдХрд╛рд░рдг, рд╕рдорд┐рддрд┐ рдиреЗ рдПрдХ рдирдИ рд╕реБрд╡рд┐рдзрд╛ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд┐рдпрд╛, рдЬрд┐рд╕реЗ рд╣рдо "рдЬрдЧрд╣" ... "рд▓рдВрдмреЛрджрд░ рднрд╛рд╡" рдХрд╣ рд╕рдХрддреЗ рд╣реИрдВ!

рдпрджрд┐ рд╣рдо N3337 - C ++ 11 рдХреЗ рдЕрдВрддрд┐рдо рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рд▓реИрдореНрдмреНрдбрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд▓рдЧ рдЕрдиреБрднрд╛рдЧ рджреЗрдЦреЗрдВрдЧреЗ: [expr.prim.lambda] ред

C ++ 11 рд╕реЗ рдЖрдЧреЗ

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рднрд╛рд╖рд╛ рдореЗрдВ рд╕рдордЭрджрд╛рд░реА рд╕реЗ рд▓рдВрдмреЛрджрд░ рдХреЛ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рд╣реИред рд╡реЗ рдирдП рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдлрд┐рд░ рд╕рдВрдХрд▓рдХ рдЗрд╕реЗ рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╡рд░реНрдЧ рдореЗрдВ "рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд" рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдЦреНрддреА рд╕реЗ рдЯрд╛рдЗрдк рдХреА рдЧрдИ рднрд╛рд╖рд╛ рдХреЗ рд╕рднреА рдлрд╛рдпрджреЗ (рдФрд░ рдХрднреА-рдХрднреА рдиреБрдХрд╕рд╛рди) рд╣реИрдВред

рдпрд╣рд╛рдБ рдПрдХ рдореВрд▓ рдХреЛрдб рдЙрджрд╛рд╣рд░рдг рд╣реИ рдЬреЛ рд╕рдВрдмрдВрдзрд┐рдд рд╕реНрдерд╛рдиреАрдп рдлрд╝рдирдХрд╛рд░ рд╡рд╕реНрддреБ рдХреЛ рднреА рджрд┐рдЦрд╛рддрд╛ рд╣реИ:

 #include <iostream> #include <algorithm> #include <vector> int main() { struct { void operator()(int x) const { std::cout << x << '\n'; } } someInstance; std::vector<int> v; v.push_back(1); v.push_back(2); std::for_each(v.begin(), v.end(), someInstance); std::for_each(v.begin(), v.end(), [] (int x) { std::cout << x << '\n'; } ); } 

рдЙрджрд╛рд╣рд░рдг: @WandBox

рдЖрдк CppInsights рдХреЛ рднреА рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рджрд┐рдЦрд╛рддрд╛ рд╣реИ рдХрд┐ рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЛрдб рдХреЛ рдХреИрд╕реЗ рдмрдврд╝рд╛рддрд╛ рд╣реИ:

рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВ:

CppInsighs: рд▓реИрдореНрдмреНрдбрд╛ рдЯреЗрд╕реНрдЯ

рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рд╕рдВрдХрд▓рдХ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рддрд╛ рд╣реИ:

 [] (int x) { std::cout << x << '\n'; } 


рдЗрд╕ (рд╕рд░рд▓реАрдХреГрдд рд░реВрдк) рдХреЗ рд╕рдорд╛рди рдХреБрдЫ рдореЗрдВ:

 struct { void operator()(int x) const { std::cout << x << '\n'; } } someInstance; 

рд▓рдВрдмреЛрджрд░ рдПрдХреНрд╕рдкреНрд░реЗрд╢рди рд╕рд┐рдВрдЯреИрдХреНрд╕:

 [] () { ; } ^ ^ ^ | | | | | : mutable, exception, trailing return, ... | | |   |      

рд╢реБрд░реВ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдХреБрдЫ рдкрд░рд┐рднрд╛рд╖рд╛рдПрдБ:

[Expr.prim.lambda # 2] рд╕реЗ :

рдПрдХ рд▓рдВрдмреЛрджрд░ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд░рдиреЗ рд╕реЗ рдПрдХ рдЕрд╕реНрдерд╛рдпреА рдЧрддрд┐рд░реЛрдз рдЙрддреНрдкрдиреНрди рд╣реЛрддрд╛ рд╣реИред рдЗрд╕ рдЕрд╕реНрдерд╛рдпреА рд╡рд╕реНрддреБ рдХреЛ рдХреНрд▓реЛрдЬрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред

рдФрд░ [expr.prim.lambda # 3] рд╕реЗ :

рд▓реИрдореНрдмреНрдбрд╛ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХрд╛ рдкреНрд░рдХрд╛рд░ (рдЬреЛ рдПрдХ рдХреНрд▓реЛрдЬрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рдкреНрд░рдХрд╛рд░ рднреА рд╣реИ) рдХреНрд▓рд╛рд╕ рдХрд╛ рдПрдХ рдЕрдиреВрдард╛ рдирд╛рдо рд░рд╣рд┐рдд рдЧреИрд░-рдпреВрдирд┐рдпрди рдкреНрд░рдХрд╛рд░ рд╣реИ рдЬрд┐рд╕реЗ рдХреНрд▓реЛрдЬрд░ рдкреНрд░рдХрд╛рд░ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред

рд▓рдВрдмреЛрджрд░ рднрд╛рд╡ рдХреЗ рдХреБрдЫ рдЙрджрд╛рд╣рд░рдг:

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:

 [](float f, int a) { return a*f; } [](MyClass t) -> int { auto a = t.compute(); return a; } [](int a, int b) { return a < b; } 

рд▓рдВрдмреЛрджрд░ рдкреНрд░рдХрд╛рд░

рдЪреВрдВрдХрд┐ рдХрдВрдкрд╛рдЗрд▓рд░ рдкреНрд░рддреНрдпреЗрдХ рд▓реИрдореНрдмреНрдбрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрджреНрд╡рд┐рддреАрдп рдирд╛рдо рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ рдкрд╣рд▓реЗ рд╕реЗ рдЬрд╛рдирдирд╛ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИред

 auto myLambda = [](int a) -> double { return 2.0 * a; } 

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ [expr.prim.lambda] :
рд▓реИрдореНрдмреНрдбрд╛ рдПрдХреНрд╕рдкреНрд░реЗрд╢рди рд╕реЗ рдЬреБрдбрд╝реЗ рдХреНрд▓реЛрдЬрд░ рдЯрд╛рдЗрдк рдореЗрдВ рдПрдХ рд░рд┐рдореЛрдЯ ([dcl.fct.def.delete]) рдбрд┐рдлреЙрд▓реНрдЯ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдФрд░ рдПрдХ рд░рд┐рдореЛрдЯ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдСрдкрд░реЗрдЯрд░ рд╣реЛрддрд╛ рд╣реИред

рдЗрд╕рд▓рд┐рдП, рдЖрдк рдирд╣реАрдВ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ:

 auto foo = [&x, &y]() { ++x; ++y; }; decltype(foo) fooCopy; 

рдЗрд╕рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк GCC рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рддреНрд░реБрдЯрд┐ рд╣реЛрдЧреА:

 error: use of deleted function 'main()::<lambda()>::<lambda>()' decltype(foo) fooCopy; ^~~~~~~ note: a lambda closure type has a deleted default constructor 

рдХреЙрд▓ рдСрдкрд░реЗрдЯрд░

рдХреЛрдб рдЬрд┐рд╕реЗ рдЖрдкрдиреЗ рд▓реИрдореНрдмреНрдбрд╛ рдмреЙрдбреА рдореЗрдВ рд░рдЦрд╛ рд╣реИ, рдЙрд╕реЗ рдСрдкрд░реЗрдЯрд░ () рдореЗрдВ рдЗрд╕реА рдХреНрд▓реЛрдЬрд░ рдкреНрд░рдХрд╛рд░ рдХреЗ рдХреЛрдб рдореЗрдВ рдЕрдиреБрд╡рд╛рдж рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рдпрд╣ рдПрдХ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд╕реНрдерд┐рд░ рд╡рд┐рдзрд┐ рд╣реИред рдЖрдк рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдШреЛрд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдкрд░рд┐рд╡рд░реНрддрдирд╢реАрд▓ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдХреЗ рдЗрд╕реЗ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ:

 auto myLambda = [](int a) mutable { std::cout << a; } 

рд╣рд╛рд▓рд╛рдВрдХрд┐ рдирд┐рд░рдВрддрд░ рд╡рд┐рдзрд┐ рдПрдХ рдЦрд╛рд▓реА рдХреИрдкреНрдЪрд░ рд╕реВрдЪреА рдХреЗ рдмрд┐рдирд╛ рдПрдХ рд▓рдВрдмреЛрджрд░ рдХреЗ рд▓рд┐рдП "рд╕рдорд╕реНрдпрд╛" рдирд╣реАрдВ рд╣реИ ... рдпрд╣ рддрдм рдорд╛рдпрдиреЗ рд░рдЦрддрд╛ рд╣реИ рдЬрдм рдЖрдк рдХреБрдЫ рдкрд░ рдХрдмреНрдЬрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред

рдХрдмреНрдЬрд╛

[] рди рдХреЗрд╡рд▓ рдПрдХ рд▓реИрдореНрдмреНрдбрд╛ рдХрд╛ рдкрд░рд┐рдЪрдп рджреЗрддрд╛ рд╣реИ, рдмрд▓реНрдХрд┐ рдЗрд╕рдореЗрдВ рдХреИрдж рдХрд┐рдП рдЧрдП рдЪрд░реЛрдВ рдХреА рд╕реВрдЪреА рднреА рд╣реЛрддреА рд╣реИред рдЗрд╕реЗ рдХреИрдкреНрдЪрд░ рд╕реВрдЪреА рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред

рдХрд┐рд╕реА рд╡реИрд░рд┐рдПрдмрд▓ рдХреЛ рдХреИрдкреНрдЪрд░ рдХрд░рдХреЗ, рдЖрдк рдХреНрд▓реЛрдЬрд░ рдкреНрд░рдХрд╛рд░ рдореЗрдВ рдЗрд╕ рд╡реИрд░рд┐рдПрдмрд▓ рдХреА рдХреЙрдкреА рдореЗрдВрдмрд░ рдмрдирд╛рддреЗ рд╣реИрдВред рдлрд┐рд░ рд▓реИрдореНрдмреНрдбрд╛ рдмреЙрдбреА рдХреЗ рдЕрдВрджрд░ рдЖрдк рдЗрд╕реЗ рдПрдХреНрд╕реЗрд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдореВрд▓ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рд╣реИ:

  • [рдФрд░] - рд╕рдВрджрд░реНрдн рджреНрд╡рд╛рд░рд╛ рдХрдмреНрдЬрд╛, рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рднрдВрдбрд╛рд░рдг рдореЗрдВ рд╕рднреА рдЪрд░ рджрд╛рдпрд░реЗ рдореЗрдВ рдШреЛрд╖рд┐рдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ
  • [=] - рдорд╛рди рджреНрд╡рд╛рд░рд╛ рдХреИрдкреНрдЪрд░ рдХрд░рдирд╛, рдорд╛рди рдХреЙрдкреА рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ
  • [x, & y] - рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ x рдХреЛ рдорд╛рди рд╕реЗ, рдФрд░ y рдХреЛ рд╕рдВрджрд░реНрдн рджреНрд╡рд╛рд░рд╛ рдХреИрдкреНрдЪрд░ рдХрд░рддрд╛ рд╣реИ

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:

 int x = 1, y = 1; { std::cout << x << " " << y << std::endl; auto foo = [&x, &y]() { ++x; ++y; }; foo(); std::cout << x << " " << y << std::endl; } 

рдЖрдк рдпрд╣рд╛рдВ рдкреВрд░реЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╕рд╛рде рдЦреЗрд▓ рд╕рдХрддреЗ рд╣реИрдВ: @Wandbox

рдпрджреНрдпрдкрд┐ рдпрд╣ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдирд╛ [=] рдпрд╛ [&] рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ - рдЪреВрдВрдХрд┐ рдпрд╣ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рднрдВрдбрд╛рд░рдг рдореЗрдВ рд╕рднреА рдЪрд░ рдХреЛ рдХреИрдкреНрдЪрд░ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЪрд░ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдХреИрдкреНрдЪрд░ рдХрд░рдирд╛ рдЕрдзрд┐рдХ рд╕реНрдкрд╖реНрдЯ рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╕рдВрдХрд▓рдХ рдЖрдкрдХреЛ рдЕрд╡рд╛рдВрдЫрд┐рдд рдкреНрд░рднрд╛рд╡реЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪреЗрддрд╛рд╡рдиреА рджреЗ рд╕рдХрддрд╛ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╡реИрд╢реНрд╡рд┐рдХ рдФрд░ рд╕реНрдерд┐рд░ рдЪрд░ рдкрд░ рдиреЛрдЯреНрд╕)

рдЖрдк рд╕реНрдХреЙрдЯ рдореЗрдпрд░реНрд╕ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рднрд╛рд╡реА рдореЙрдбрд░реНрди C ++ рдХреЗ рдкреИрд░рд╛ 31 рдореЗрдВ рдФрд░ рдЕрдзрд┐рдХ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВ: "рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХреИрдкреНрдЪрд░ рдореЛрдб рд╕реЗ рдмрдЪреЗрдВред"

рдФрд░ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЙрджреНрдзрд░рдг:
C ++ рдХреНрд▓реЛрдЬрд░ рдХреИрдкреНрдЪрд░ рдХрд┐рдП рдЧрдП рд▓рд┐рдВрдХ рдХреЗ рдЬреАрд╡рдирдХрд╛рд▓ рдХреЛ рдирд╣реАрдВ рдмрдврд╝рд╛рддрд╛ рд╣реИред


рдкрд░рд┐рд╡рд░реНрддрдирд╢реАрд▓

рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рдХреНрд▓реЛрдЬрд░ рдкреНрд░рдХрд╛рд░ рдСрдкрд░реЗрдЯрд░ () рд╕реНрдерд┐рд░ рд╣реИ, рдФрд░ рдЖрдк рд▓рдВрдмреЛрджрд░ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗ рд╢рд░реАрд░ рдХреЗ рдЕрдВрджрд░ рдХреИрдкреНрдЪрд░ рдХрд┐рдП рдЧрдП рдЪрд░ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред
рдпрджрд┐ рдЖрдк рдЗрд╕ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдмрджрд▓рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдкреИрд░рд╛рдореАрдЯрд░ рд╕реВрдЪреА рдХреЗ рдмрд╛рдж рдкрд░рд┐рд╡рд░реНрддрдирд╢реАрд▓ рдХреАрд╡рд░реНрдб рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛:

 int x = 1, y = 1; std::cout << x << " " << y << std::endl; auto foo = [x, y]() mutable { ++x; ++y; }; foo(); std::cout << x << " " << y << std::endl; 

рдЙрдкрд░реЛрдХреНрдд рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рд╣рдо x рдФрд░ y рдХреЗ рдореВрд▓реНрдпреЛрдВ рдХреЛ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ ... рд▓реЗрдХрд┐рди рдпреЗ рдХреЗрд╡рд▓ рд╕рдВрд▓рдЧреНрди рджрд╛рдпрд░реЗ рд╕реЗ x рдФрд░ y рдХреА рдкреНрд░рддрд┐рдпрд╛рдВ рд╣реИрдВред

рд╡реИрд╢реНрд╡рд┐рдХ рдЪрд░ рдХреИрдкреНрдЪрд░

рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ рд╡реИрд╢реНрд╡рд┐рдХ рдореВрд▓реНрдп рд╣реИ рдФрд░ рдлрд┐рд░ рдЖрдк рдПрдХ рд▓реИрдореНрдмреНрдбрд╛ рдореЗрдВ [=] рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рд╕реЛрдЪ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╡реИрд╢реНрд╡рд┐рдХ рдореВрд▓реНрдп рднреА рдореВрд▓реНрдп рджреНрд╡рд╛рд░рд╛ рдХрдмреНрдЬрд╛ рдХрд░ рд▓рд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ ... рд▓реЗрдХрд┐рди рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИред

 int global = 10; int main() { std::cout << global << std::endl; auto foo = [=] () mutable { ++global; }; foo(); std::cout << global << std::endl; [] { ++global; } (); std::cout << global << std::endl; [global] { ++global; } (); } 

рдЖрдк рдпрд╣рд╛рдВ рдХреЛрдб рдХреЗ рд╕рд╛рде рдЦреЗрд▓ рд╕рдХрддреЗ рд╣реИрдВ: @Wandbox

рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд╕рдВрдЧреНрд░рд╣рдг рдореЗрдВ рдХреЗрд╡рд▓ рдЪрд░ рд╣реА рдХреИрдкреНрдЪрд░ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рдЬреАрд╕реАрд╕реА рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЪреЗрддрд╛рд╡рдиреА рднреА рдЬрд╛рд░реА рдХрд░ рд╕рдХрддрд╛ рд╣реИ:

 warning: capture of variable 'global' with non-automatic storage duration 

рдпрд╣ рдЪреЗрддрд╛рд╡рдиреА рдХреЗрд╡рд▓ рддрднреА рджрд┐рдЦрд╛рдИ рджреЗрдЧреА рдЬрдм рдЖрдк рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╡реИрд╢реНрд╡рд┐рдХ рдЪрд░ рдХреЛ рдХреИрдкреНрдЪрд░ рдХрд░реЗрдВрдЧреЗ, рдЗрд╕рд▓рд┐рдП рдпрджрд┐ рдЖрдк [=] рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╕рдВрдХрд▓рдХ рдЖрдкрдХреА рдорджрдж рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред
рдХреНрд▓реИрдВрдЧ рд╕рдВрдХрд▓рдХ рдЕрдзрд┐рдХ рдЙрдкрдпреЛрдЧреА рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдПрдХ рддреНрд░реБрдЯрд┐ рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИ:

 error: 'global' cannot be captured because it does not have automatic storage duration 

@Wandbox рджреЗрдЦреЗрдВ

рд╕реНрдереИрддрд┐рдХ рдЪрд░ рдХреЛ рдкрдХрдбрд╝рдирд╛

рд╕реНрдерд┐рд░ рдЪрд░ рдХреЛ рдкрдХрдбрд╝рдирд╛ рд╡реИрд╢реНрд╡рд┐рдХ рдХрдмреНрдЬрд╛ рдХрд░рдиреЗ рдХреЗ рд╕рдорд╛рди рд╣реИ:

 #include <iostream> void bar() { static int static_int = 10; std::cout << static_int << std::endl; auto foo = [=] () mutable { ++static_int; }; foo(); std::cout << static_int << std::endl; [] { ++static_int; } (); std::cout << static_int << std::endl; [static_int] { ++static_int; } (); } int main() { bar(); } 

рдЖрдк рдпрд╣рд╛рдВ рдХреЛрдб рдХреЗ рд╕рд╛рде рдЦреЗрд▓ рд╕рдХрддреЗ рд╣реИрдВ: @Wandbox

рдирд┐рд╖реНрдХрд░реНрд╖:

 10 11 12 

рдФрд░ рдлрд┐рд░, рдПрдХ рдЪреЗрддрд╛рд╡рдиреА рдХреЗрд╡рд▓ рддрднреА рджрд┐рдЦрд╛рдИ рджреЗрдЧреА рдЬрдм рдЖрдк рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдПрдХ рд╕реНрдерд┐рд░ рдЪрд░ рдкрд░ рдХрдмреНрдЬрд╛ рдХрд░ рд▓реЗрдВрдЧреЗ, рдЗрд╕рд▓рд┐рдП рдпрджрд┐ рдЖрдк [=] рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╕рдВрдХрд▓рдХ рдЖрдкрдХреА рдорджрдж рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред

рдХрдХреНрд╖рд╛ рд╕рджрд╕реНрдп рдХрдмреНрдЬрд╛

рдХреНрдпрд╛ рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ:

 #include <iostream> #include <functional> struct Baz { std::function<void()> foo() { return [=] { std::cout << s << std::endl; }; } std::string s; }; int main() { auto f1 = Baz{"ala"}.foo(); auto f2 = Baz{"ula"}.foo(); f1(); f2(); } 

рдХреЛрдб рдПрдХ рдмрд╛рдЬ рдСрдмреНрдЬреЗрдХреНрдЯ рдШреЛрд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рдлрд┐рд░ foo() рдХрд╣рддрд╛ рд╣реИред рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ foo() рдПрдХ рд▓реИрдореНрдмреНрдбрд╛ ( std::function рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд std::function ) рджреЗрддрд╛ рд╣реИ рдЬреЛ рд╡рд░реНрдЧ рдХреЗ рдПрдХ рд╕рджрд╕реНрдп рдХреЛ рдкрдХрдбрд╝рддрд╛ рд╣реИред

рдЪреВрдВрдХрд┐ рд╣рдо рдЕрд╕реНрдерд╛рдпреА рд╡рд╕реНрддреБрдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рдХрд┐ f1 рдФрд░ f2 рдХрд╣реЗ рдЬрд╛рдиреЗ рдкрд░ рдХреНрдпрд╛ рд╣реЛрдЧрд╛ред рдпрд╣ рдПрдХ рдЭреВрд▓рдиреЗ рд╡рд╛рд▓реА рд▓рд┐рдВрдХ рд╕рдорд╕реНрдпрд╛ рд╣реИ рдЬреЛ рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд╛ рдХрд╛рд░рдг рдмрдирддреА рд╣реИред

рдЗрд╕реА рддрд░рд╣:

 struct Bar { std::string const& foo() const { return s; }; std::string s; }; auto&& f1 = Bar{"ala"}.foo(); //   

@Wandbox рдХреЛрдб рдХреЗ рд╕рд╛рде рдЦреЗрд▓рддреЗ рд╣реИрдВ

рдлрд┐рд░, рдпрджрд┐ рдЖрдк рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдХреИрдкреНрдЪрд░ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддреЗ рд╣реИрдВ ([s]):

 std::function<void()> foo() { return [s] { std::cout << s << std::endl; }; } 

рд╕рдВрдХрд▓рдХ рдЖрдкрдХреА рддреНрд░реБрдЯрд┐ рдХреЛ рд░реЛрдХ рджреЗрдЧрд╛:

 In member function 'std::function<void()> Baz::foo()': error: capture of non-variable 'Baz::s' error: 'this' was not captured for this lambda function ... 

рдПрдХ рдЙрджрд╛рд╣рд░рдг рджреЗрдЦреЗрдВ: @Wandbox

рдореВрд╡-рд╕рдХреНрд╖рдо-рдХреЗрд╡рд▓ рдСрдмреНрдЬреЗрдХреНрдЯ

рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ рдРрд╕реА рд╡рд╕реНрддреБ рд╣реИ рдЬрд┐рд╕реЗ рдХреЗрд╡рд▓ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, unique_ptr), рддреЛ рдЖрдк рдЗрд╕реЗ рдПрдХ рдХреИрдж рдХрд┐рдП рдЧрдП рдЪрд░ рдХреЗ рд░реВрдк рдореЗрдВ рд▓реИрдореНрдмреНрдбрд╛ рдореЗрдВ рдирд╣реАрдВ рдбрд╛рд▓ рд╕рдХрддреЗред рдореВрд▓реНрдп рджреНрд╡рд╛рд░рд╛ рдХреИрдкреНрдЪрд░ рдХрд░рдирд╛ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдк рдХреЗрд╡рд▓ рд╕рдВрджрд░реНрдн рджреНрд╡рд╛рд░рд╛ рдХреИрдкреНрдЪрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ ... рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╣ рдЖрдкрдХреЛ рдЗрд╕реЗ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдирд╣реАрдВ рдХрд░реЗрдЧрд╛, рдФрд░ рд╢рд╛рдпрдж рдпрд╣ рд╡рд╣реА рдирд╣реАрдВ рд╣реИ рдЬреЛ рдЖрдк рдЪрд╛рд╣рддреЗ рдереЗред

 std::unique_ptr<int> p(new int[10]); auto foo = [p] () {}; //  .... 

рд▓рдЧрд╛рддрд╛рд░ рдмрдЪрдд

рдпрджрд┐ рдЖрдк рдПрдХ рдирд┐рд░рдВрддрд░ рдЪрд░ рдкрд░ рдХрдмреНрдЬрд╛ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдХрдмреНрдЬ рд╕рдВрд░рдХреНрд╖рд┐рдд рд╣реИ:

 int const x = 10; auto foo = [x] () mutable { std::cout << std::is_const<decltype(x)>::value << std::endl; x = 11; }; foo(); 

рдХреЛрдб рджреЗрдЦреЗрдВ: @Wandbox

рд╡рд╛рдкрд╕реА рдкреНрд░рдХрд╛рд░

C ++ 11 рдореЗрдВ, рдЖрдк рд░рд┐рдЯрд░реНрди рд▓реИрдореНрдмрдбрд╛ рдЯрд╛рдЗрдк рдХреЛ trailing рдЫреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдлрд┐рд░ рдХрдВрдкрд╛рдЗрд▓рд░ рдЗрд╕реЗ рдЖрдкрдХреЗ рд▓рд┐рдП рдЖрдЙрдЯрдкреБрдЯ рдХрд░реЗрдЧрд╛ред

рдкреНрд░рд╛рд░рдВрдн рдореЗрдВ, рд░рд┐рдЯрд░реНрди рд╡реИрд▓реНрдпреВ рдЯрд╛рдЗрдк рдХрд╛ рдЖрдЙрдЯрдкреБрдЯ рдПрдХ рд░рд┐рдЯрд░реНрди рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рд╡рд╛рд▓реЗ рд▓реИрдореНрдмреНрдбрд╛ рддрдХ рд╕реАрдорд┐рдд рдерд╛, рд▓реЗрдХрд┐рди рдпрд╣ рдкреНрд░рддрд┐рдмрдВрдз рдЬрд▓реНрджреА рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдХреНрдпреЛрдВрдХрд┐ рдЕрдзрд┐рдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рдереАред

рд╕реА ++ рдорд╛рдирдХ рдХреЛрд░ рднрд╛рд╖рд╛ рджреЛрд╖ рд░рд┐рдкреЛрд░реНрдЯ рдФрд░ рд╕реНрд╡реАрдХреГрдд рдореБрджреНрджреЗ рджреЗрдЦреЗрдВ (рд╕рд╣реА рд▓рд┐рдВрдХ рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдереЙрдорд╕ рдХрд╛ рдзрдиреНрдпрд╡рд╛рдж!)

рдЗрд╕ рдкреНрд░рдХрд╛рд░, C ++ 11 рд╕реЗ рд╢реБрд░реВ рд╣реЛрдХрд░, рдХрдВрдкрд╛рдЗрд▓рд░ рд░рд┐рдЯрд░реНрди рдорд╛рди рдХреЗ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛ рд╕рдХрддрд╛ рд╣реИ рдпрджрд┐ рд╕рднреА рд░рд┐рдЯрд░реНрди рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдХреЛ рдПрдХ рд╣реА рдкреНрд░рдХрд╛рд░ рдореЗрдВ рдмрджрд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдпрджрд┐ рд╕рднреА рд░рд┐рдЯрд░реНрди рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЛ рд▓реМрдЯрд╛рддреЗ рд╣реИрдВ рдФрд░ рд░реВрдкрд╛рдВрддрд░рдг рд▓реИрд╡рд▓реНрдпреВ-рдЯреВ-рд░рд┐рд╡рд▓реНрдпреВ (7.1 [conv.lval]), рдПрд░реЗ-рдЯреВ-рдкреЙрдЗрдВрдЯрд░ (7.2 [conv.array]) рдФрд░ рдлрдВрдХреНрд╢рди-рдЯреВ-рдкреЙрдЗрдВрдЯрд░ (7.3 / рд╡рд╛рдХреНрдп) рдХреЗ рдмрд╛рдж рд░рд┐рдЯрд░реНрди рдЯрд╛рдЗрдк рдХрд░рддреЗ рд╣реИрдВред func]) рдЬреЗрдиреЗрд░рд┐рдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рдорд╛рди рд╣реИ;
 auto baz = [] () { int x = 10; if ( x < 20) return x * 1.1; else return x * 2.1; }; 

рдЖрдк рдпрд╣рд╛рдВ рдХреЛрдб рдХреЗ рд╕рд╛рде рдЦреЗрд▓ рд╕рдХрддреЗ рд╣реИрдВ: @Wandbox

рдКрдкрд░ рд▓рдВрдмреЛрджрд░ рдореЗрдВ рджреЛ return , рд▓реЗрдХрд┐рди рд╡реЗ рд╕рднреА double рдЗрд╢рд╛рд░рд╛ рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдХрдВрдкрд╛рдЗрд▓рд░ рдЯрд╛рдЗрдк рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

IIFE - рддреБрд░рдВрдд рд▓рд╛рдЧреВ рд╕рдорд╛рд░реЛрд╣ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐

рд╣рдорд╛рд░реЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ, рдореИрдВрдиреЗ рдПрдХ рд▓реИрдореНрдмреНрдбрд╛ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдФрд░ рдлрд┐рд░ рдЗрд╕реЗ рдХреНрд▓реЛрдЬрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдмреБрд▓рд╛рдпрд╛ ... рд▓реЗрдХрд┐рди рдЗрд╕реЗ рддреБрд░рдВрдд рднреА рдХрд╣рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

 int x = 1, y = 1; [&]() { ++x; ++y; }(); // <-- call () std::cout << x << " " << y << std::endl; 

рдРрд╕реА рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдирд┐рд░рдВрддрд░ рд╡рд╕реНрддреБрдУрдВ рдХреЗ рдЬрдЯрд┐рд▓ рдкреНрд░рд╛рд░рдВрднрд┐рдХрдХрд░рдг рдореЗрдВ рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддреА рд╣реИред

 const auto val = []() { /*   ... */ }(); 

рдореИрдВрдиреЗ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреЙрдореНрдкреНрд▓реЗрдХреНрд╕ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рдкреЛрд╕реНрдЯ рдХреЗ рд▓рд┐рдП IIFE рдореЗрдВ рдЕрдзрд┐рдХ рд▓рд┐рдЦрд╛ред

рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдкреЙрдЗрдВрдЯрд░ рдореЗрдВ рдХрдирд╡рд░реНрдЯ рдХрд░реЗрдВ
рдХреИрдкреНрдЪрд░ рдХреЗ рдмрд┐рдирд╛ рд▓реИрдореНрдмрдбрд╛ рдПрдХреНрд╕рдкреНрд░реЗрд╢рди рдХреЗ рд▓рд┐рдП рдХреНрд▓реЛрдЬрд░ рдЯрд╛рдЗрдк рдореЗрдВ рдПрдХ рдУрдкрди рдиреЙрди-рд╡рд░реНрдЪреБрдЕрд▓ рдЗрдВрдкреИрдХреНрдЯ рдлрдВрдХреНрд╢рди рд╣реИ, рдЬреЛ рдХрд┐рд╕реА рдкреЙрдЗрдВрдЯрд░ рдХреЛ рдПрдХ рдлрдВрдХреНрд╢рди рдореЗрдВ рдХрдиреНрд╡рд░реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реЛрддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдПрдХ рд╣реА рдкреИрд░рд╛рдореАрдЯрд░ рд╣реЛрддрд╛ рд╣реИ рдФрд░ рдХреНрд▓реЛрдЬрд░ рдЯрд╛рдЗрдк рдХреЗ рдлрдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рдСрдкрд░реЗрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рд░рд┐рдЯрд░реНрди рдЯрд╛рдЗрдк рд╣реЛрддрд╛ рд╣реИред рдЗрд╕ рд░реВрдкрд╛рдВрддрд░рдг рдлрд╝рдВрдХреНрд╢рди рджреНрд╡рд╛рд░рд╛ рд▓реМрдЯрд╛рдП рдЧрдП рдорд╛рди рдХреЛ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдкрддрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬрд┐рд╕реЗ рдЬрдм рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдПрдХ рдХреНрд▓реЛрдЬрд░ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рдорд╛рди рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдСрдкрд░реЗрдЯрд░ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд╕рдорд╛рди рдкреНрд░рднрд╛рд╡ рдкрдбрд╝рддрд╛ рд╣реИред
рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рдЖрдк рд▓рдВрдмрд░ рдХреЛ рдмрд┐рдирд╛ рдХреИрдкреНрдЪрд░ рдХреЗ рдлрд╝рдВрдХреНрд╢рди рдкреЙрдЗрдВрдЯрд░ рдореЗрдВ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВред

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:

 #include <iostream> void callWith10(void(* bar)(int)) { bar(10); } int main() { struct { using f_ptr = void(*)(int); void operator()(int s) const { return call(s); } operator f_ptr() const { return &call; } private: static void call(int s) { std::cout << s << std::endl; }; } baz; callWith10(baz); callWith10([](int x) { std::cout << x << std::endl; }); } 

рдЖрдк рдпрд╣рд╛рдВ рдХреЛрдб рдХреЗ рд╕рд╛рде рдЦреЗрд▓ рд╕рдХрддреЗ рд╣реИрдВ: @Wandbox

C ++ 14 рдореЗрдВ рд╕реБрдзрд╛рд░

N4140 рдорд╛рдирдХ рдФрд░ рд▓реИрдореНрдмреНрдбрд╛: [expr.prim.lambda] ред

C ++ 14 рдиреЗ рд▓реИрдореНрдмреНрдбрд╛ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдореЗрдВ рджреЛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╕реБрдзрд╛рд░ рдЬреЛрдбрд╝реЗ:

  • рд╢реБрд░реБрдЖрддреА рдХреЗ рд╕рд╛рде рдХрдмреНрдЬрд╛
  • рдЖрдо рд▓рдВрдмреЛрджрд░

рдпреЗ рд╕реБрд╡рд┐рдзрд╛рдПрдБ C ++ 11 рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреЗрдиреЗ рд╡рд╛рд▓реА рдХрдИ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╣рд▓ рдХрд░рддреА рд╣реИрдВред

рд╡рд╛рдкрд╕реА рдкреНрд░рдХрд╛рд░

рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рдд: рдЖрдЙрдЯрдкреБрдЯ рдирд┐рдпрдореЛрдВ рдХрд╛ рдкрд╛рд▓рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд▓реИрдореНрдмреНрдбрд╛ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗ рд░рд┐рдЯрд░реНрди рдореВрд▓реНрдп рдкреНрд░рдХрд╛рд░ рдХреЗ рдЖрдЙрдЯрдкреБрдЯ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

[expr.prim.lambda # 4]
рд▓реИрдореНрдмреНрдбрд╛ рдХрд╛ рд╡рд╛рдкрд╕реА рдкреНрд░рдХрд╛рд░ рдСрдЯреЛ рд╣реИ, рдЬрд┐рд╕реЗ рдкреАрдЫреЗ рдЖрдиреЗ рд╡рд╛рд▓реЗ рд╡рд┐рд╡рд░рдгреЛрдВ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдпрджрд┐ рд░рд┐рдЯрд░реНрди рдбреАрдЯреЗрд▓реНрд╕ рдореЗрдВ рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ / рдпрд╛ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ [dcl.spec.auto] рдореЗрдВ рд╡рд░реНрдгрд┐рдд рд╣реИред
рд╢реБрд░реБрдЖрддреА рдХреЗ рд╕рд╛рде рдХрдмреНрдЬрд╛

рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, рд╣рдо рдХреНрд▓реЛрдЬрд░ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдПрдХ рдирдпрд╛ рд╕рджрд╕реНрдп рдЪрд░ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдлрд┐рд░ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд▓рдВрдмреЛрджрд░ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗ рдЕрдВрджрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:

 int main() { int x = 10; int y = 11; auto foo = [z = x+y]() { std::cout << z << '\n'; }; foo(); } 

рдпрд╣ рдХрдИ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╣рд▓ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЙрди рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рдЬреЛ рдХреЗрд╡рд▓ рдЪрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз рд╣реИрдВред

рд╡рд┐рд╕реНрдерд╛рдкрди

рдЕрдм рд╣рдо рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдХреНрд▓реЛрдЬрд░ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рджрд╕реНрдп рдореЗрдВ рд▓реЗ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ:

 #include <memory> int main() { std::unique_ptr<int> p(new int[10]); auto foo = [x=10] () mutable { ++x; }; auto bar = [ptr=std::move(p)] {}; auto baz = [p=std::move(p)] {}; } 

рдЕрдиреБрдХреВрд▓рди

рдПрдХ рдЕрдиреНрдп рд╡рд┐рдЪрд╛рд░ рдпрд╣ рд╣реИ рдХрд┐ рдЗрд╕реЗ рд╕рдВрднрд╛рд╡рд┐рдд рдЕрдиреБрдХреВрд▓рди рддрдХрдиреАрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПред рд╣рд░ рдмрд╛рд░ рдЬрдм рд╣рдо рд▓рдВрдмреЛрджрд░ рдХрд╣рддреЗ рд╣реИрдВ рддреЛ рдХреБрдЫ рдореВрд▓реНрдп рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп, рд╣рдо рдЗрд╕реЗ рдПрдХ рдмрд╛рд░ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝рд░ рдореЗрдВ рдЧрдгрдирд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

 #include <iostream> #include <algorithm> #include <vector> #include <memory> #include <iostream> #include <string> int main() { using namespace std::string_literals; std::vector<std::string> vs; std::find_if(vs.begin(), vs.end(), [](std::string const& s) { return s == "foo"s + "bar"s; }); std::find_if(vs.begin(), vs.end(), [p="foo"s + "bar"s](std::string const& s) { return s == p; }); } 

рдПрдХ рд╕рджрд╕реНрдп рдЪрд░ рдкрд░ рдХрдмреНрдЬрд╛

рдПрдХ рд╢реБрд░реБрдЖрддреА рдЪрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рд╕реА рд╕рджрд╕реНрдп рдЪрд░ рдХреЛ рдкрдХрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рднреА рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рддрдм рд╣рдо рд╕рджрд╕реНрдп рдЪрд░ рдХреА рдПрдХ рдкреНрд░рддрд┐ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рд▓рд┐рдВрдХ рдХреЗ рдЭреВрд▓рдиреЗ рдХреА рдЪрд┐рдВрддрд╛ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:

 struct Baz { auto foo() { return [s=s] { std::cout << s << std::endl; }; } std::string s; }; int main() { auto f1 = Baz{"ala"}.foo(); auto f2 = Baz{"ula"}.foo(); f1(); f2(); } 

рдЖрдк рдпрд╣рд╛рдВ рдХреЛрдб рдХреЗ рд╕рд╛рде рдЦреЗрд▓ рд╕рдХрддреЗ рд╣реИрдВ: @Wandbox


foo() рд╣рдо рдПрдХ рд╕рджрд╕реНрдп рдЪрд░ рдХреЛ рдмрдВрдж рдкреНрд░рдХрд╛рд░ рд╕реЗ рдХреЙрдкреА рдХрд░рдХреЗ рдХреИрдкреНрдЪрд░ рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣рдо рдСрдЯреЛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдкреВрд░реА рд╡рд┐рдзрд┐ (рдкреВрд░реНрд╡ рдореЗрдВ, C ++ 11 рдореЗрдВ рд╣рдо std::function рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ) рдХреЗ рдЙрддреНрдкрд╛рджрди рдХреЗ рд▓рд┐рдП рдХрд░рддреЗ рд╣реИрдВред

рд╕рд╛рдорд╛рдиреНрдп рд▓рдВрдмреЛрджрд░ рднрд╛рд╡

рдПрдХ рдФрд░ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╕реБрдзрд╛рд░ рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рд▓реИрдореНрдмреНрдбрд╛ рд╣реИред
C ++ 14 рд╕реЗ рд╢реБрд░реВ рдХрд░рдХреЗ рдЖрдк рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ:

 auto foo = [](auto x) { std::cout << x << '\n'; }; foo(10); foo(10.1234); foo("hello world"); 

рдпрд╣ рдЯрд╛рдЗрдк рдХреНрд▓реЛрдЬрд░ рдХреЗ рдХреЙрд▓ рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдореЗрдВ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдбрд┐рдХреНрд▓реЗрд░реЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИ:

 struct { template<typename T> void operator()(T x) const { std::cout << x << '\n'; } } someInstance; 

рдЗрд╕ рддрд░рд╣ рдХрд╛ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рд▓реИрдВрдмрдбрд╛ рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬрдм рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реЛред

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:

 std::map<std::string, int> numbers { { "one", 1 }, {"two", 2 }, { "three", 3 } }; //      pair<const string, int>! std::for_each(std::begin(numbers), std::end(numbers), [](const std::pair<std::string, int>& entry) { std::cout << entry.first << " = " << entry.second << '\n'; } ); 

рдХреНрдпрд╛ рдореИрдВ рдпрд╣рд╛рдБ рдЧрд▓рдд рд╣реВрдБ? рдХреНрдпрд╛ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдореЗрдВ рд╕рд╣реА рдкреНрд░рдХрд╛рд░ рд╣реИ?
ред
ред
ред
рд╢рд╛рдпрдж рдирд╣реАрдВ, рдХреНрдпреЛрдВрдХрд┐ std :: map std::pair<const Key, T> рдХрд╛ рдорд╛рди рдкреНрд░рдХрд╛рд░ рд╣реИред рддреЛ рдореЗрд░рд╛ рдХреЛрдб рд▓рд╛рдЗрдиреЛрдВ рдХреА рдЕрддрд┐рд░рд┐рдХреНрдд рдкреНрд░рддрд┐рдпрд╛рдВ рдмрдирд╛ рджреЗрдЧрд╛ ...
рдпрд╣ auto рд╕рд╛рде рддрдп рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

 std::for_each(std::begin(numbers), std::end(numbers), [](auto& entry) { std::cout << entry.first << " = " << entry.second << '\n'; } ); 

рдЖрдк рдпрд╣рд╛рдВ рдХреЛрдб рдХреЗ рд╕рд╛рде рдЦреЗрд▓ рд╕рдХрддреЗ рд╣реИрдВ: @Wandbox

рдирд┐рд╖реНрдХрд░реНрд╖

рдХреНрдпрд╛ рдХрд╣рд╛рдиреА рд╣реИ!

рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рд╣рдордиреЗ C ++ 03 рдФрд░ C ++ 11 рдореЗрдВ рд▓реИрдореНрдмрдбрд╛ рдПрдХреНрд╕рдкреНрд░реЗрд╢рди рдХреЗ рдкрд╣рд▓реЗ рджрд┐рдиреЛрдВ рд╕реЗ рд╢реБрд░реБрдЖрдд рдХреА рдФрд░ C ++ 14 рдореЗрдВ рдПрдХ рдмреЗрд╣рддрд░ рд╕рдВрд╕реНрдХрд░рдг рдкрд░ рдЪрд▓реЗ рдЧрдПред

рдЖрдкрдиреЗ рджреЗрдЦрд╛ рдХрд┐ рд▓реИрдореНрдмрдбрд╛ рдХреИрд╕реЗ рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреА рдореВрд▓ рд╕рдВрд░рдЪрдирд╛ рдХреНрдпрд╛ рд╣реИ, рдХреИрдкреНрдЪрд░ рд╕реВрдЪреА рдХреНрдпрд╛ рд╣реИ, рдФрд░ рдмрд╣реБрдд рдХреБрдЫред

рд▓реЗрдЦ рдХреЗ рдЕрдЧрд▓реЗ рднрд╛рдЧ рдореЗрдВ, рд╣рдо C ++ 17 рдкрд░ рдЖрдЧреЗ рдмрдврд╝реЗрдВрдЧреЗ рдФрд░ C ++ 20 рдХреА рднрд╡рд┐рд╖реНрдп рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЛ рдЬрд╛рдиреЗрдВрдЧреЗред

рджреВрд╕рд░рд╛ рднрд╛рдЧ рдпрд╣рд╛рдБ рдЙрдкрд▓рдмреНрдз рд╣реИ:

рд▓реИрдореНрдмреНрдбрд╛: рд╕реА ++ 11 рд╕реЗ рд╕реА ++ 20, рднрд╛рдЧ 2 рддрдХ


рд╕рдВрджрд░реНрдн

C ++ 11 - [expr.prim.lambda]
C ++ 14 - [expr.prim.lambda]
C ++ рдореЗрдВ рд▓реИрдВрдмрдбрд╛ рдПрдХреНрд╕рдкреНрд░реЗрд╢рдВрд╕ | Microsoft рдбреЙрдХреНрд╕
рд╕реА ++ рд▓реИрдореНрдмреНрдбрд╛ - рд╕реНрдЯрд┐рдХреА рдмрд┐рдЯреНрд╕ - рдбреЗрдореЗрдЬрд┐рдлрд╝рд╛рдЗрдВрдЧ рджреНрд╡рд╛рд░рд╛ рд╕рдВрдЪрд╛рд▓рд┐рдд - рдлрд╝реЗрд╣рд╛рд╕ рджреНрд╡рд╛рд░рд╛ рд╕рдВрдЪрд╛рд▓рд┐рдд; рд╕реНрдЯрд┐рдХреА рдмрд┐рдЯреНрд╕ - рдлреЗрдмреЗрд╢ рджреНрд╡рд╛рд░рд╛ рд╕рдВрдЪрд╛рд▓рд┐рдд


рд╣рдо рдЖрдкрдХреА рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдФрд░ "C ++ рдбреЗрд╡рд▓рдкрд░" рдкрд╛рдареНрдпрдХреНрд░рдо рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрдиреЗ рд╡рд╛рд▓реЗ рд╕рднреА рдХреЛ рдЖрдордВрддреНрд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВред

Source: https://habr.com/ru/post/hi444524/


All Articles