рд╢реБрдн рджреЛрдкрд╣рд░, рджреЛрд╕реНрддреЛрдВред рдЖрдЬ рд╣рдордиреЗ рдЖрдкрдХреЗ рд▓рд┐рдП рд▓реЗрдЦ рдХреЗ рдкрд╣рд▓реЗ рднрд╛рдЧ
"рд▓реИрдореНрдмреНрдбрд╛рд╕: рд╕реА ++ 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; }();
рдРрд╕реА рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдирд┐рд░рдВрддрд░ рд╡рд╕реНрддреБрдУрдВ рдХреЗ рдЬрдЯрд┐рд▓ рдкреНрд░рд╛рд░рдВрднрд┐рдХрдХрд░рдг рдореЗрдВ рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддреА рд╣реИред
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; }); }
рдЖрдк рдпрд╣рд╛рдВ рдХреЛрдб рдХреЗ рд╕рд╛рде рдЦреЗрд▓ рд╕рдХрддреЗ рд╣реИрдВ:
@WandboxC ++ 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 } };
рдХреНрдпрд╛ рдореИрдВ рдпрд╣рд╛рдБ рдЧрд▓рдд рд╣реВрдБ? рдХреНрдпрд╛ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдореЗрдВ рд╕рд╣реА рдкреНрд░рдХрд╛рд░ рд╣реИ?
ред
ред
ред
рд╢рд╛рдпрдж рдирд╣реАрдВ, рдХреНрдпреЛрдВрдХрд┐ 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 ++ рдбреЗрд╡рд▓рдкрд░" рдкрд╛рдареНрдпрдХреНрд░рдо рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрдиреЗ рд╡рд╛рд▓реЗ рд╕рднреА рдХреЛ рдЖрдордВрддреНрд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВред