рд╣рд╛рдп, рд╣рдмреНрд░реЛрд╕реНрдХред рдкрд╛рдареНрдпрдХреНрд░рдо
"рд╕реА ++ рдбреЗрд╡рд▓рдкрд░" рдореЗрдВ рдПрдХ рдирдП рд╕рдореВрд╣ рдореЗрдВ рднрд░реНрддреА рдХреА рд╢реБрд░реБрдЖрдд рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ, рд╣рдо рдЖрдкрдХреЗ рд╕рд╛рде рд▓реЗрдЦ рдХреЗ рджреВрд╕рд░реЗ рднрд╛рдЧ "рд▓реИрдореНрдмреНрдбрд╛рд╕: рд╕реА ++ 11 рд╕реЗ рд╕реА ++ 20" рдХрд╛ рдЕрдиреБрд╡рд╛рдж рд╕рд╛рдЭрд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдкрд╣рд▓рд╛ рднрд╛рдЧ
рдпрд╣рд╛рдБ рдкрдврд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛
рд╣реИ ред
рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЗ
рдкрд╣рд▓реЗ рднрд╛рдЧ рдореЗрдВ, рд╣рдордиреЗ C ++ 03, C ++ 11 рдФрд░ C ++ 14 рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рд▓рдВрдмреЛрджрд╛ рдХреЛ рджреЗрдЦрд╛ред рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рдореИрдВрдиреЗ рдЗрд╕ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рд╕реА ++ рд╕реБрд╡рд┐рдзрд╛, рдореВрд▓ рдЙрдкрдпреЛрдЧ, рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдФрд░ рднрд╛рд╖рд╛ рдорд╛рдирдХреЛрдВ рдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдореЗрдВ рд╕реБрдзрд╛рд░ рдХреЗ рдкреАрдЫреЗ рдХреА рдкреНрд░реЗрд░рдгрд╛рдУрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд┐рдпрд╛ред рдореИрдВрдиреЗ рдХреБрдЫ рд╕реАрдорд╛рд╡рд░реНрддреА рдорд╛рдорд▓реЛрдВ рдХрд╛ рднреА рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИред
рдЕрдм рдпрд╣ C ++ 17 рдкрд░ рдЬрд╛рдиреЗ рдФрд░ рднрд╡рд┐рд╖реНрдп рдкрд░ рдПрдХ рдирдЬрд╝рд░ рд░рдЦрдиреЗ рдХрд╛ рд╕рдордп рд╣реИ (рдмрд╣реБрдд рдХрд░реАрдм!): C ++ 20ред
рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐рдПрдХ рддреНрд╡рд░рд┐рдд рдЕрдиреБрд╕реНрдорд╛рд░рдХ: рдЗрд╕ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЗ рд▓рд┐рдП рд╡рд┐рдЪрд╛рд░ рдХреНрд░рд╛рдХреЛ рдореЗрдВ рд╣рдорд╛рд░реЗ рд╣рд╛рд▓рд┐рдпрд╛ рд╕реА ++ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕рдореВрд╣ рдХреА рдмреИрдардХреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХреЗ рдмрд╛рдж рдЖрдпрд╛ред
рд▓реИрдВрдмрдбрд╛ рдПрдХреНрд╕рдкреНрд░реЗрд╢рди рдХреЗ "рдЗрддрд┐рд╣рд╛рд╕" рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рд▓рд╛рдЗрд╡ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рд╕рддреНрд░ рдерд╛ред рдмрд╛рддрдЪреАрдд C ++ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮ рдереЙрдорд╕ рдХрдорд┐рдиреНрд╕реНрдХреА (рдереЙрдорд╕ рд▓рд┐рдВрдХреНрдбрд┐рди
рдкреНрд░реЛрдлрд╝рд╛рдЗрд▓ рджреЗрдЦреЗрдВ ) рджреНрд╡рд╛рд░рд╛ рдЖрдпреЛрдЬрд┐рдд рдХреА рдЧрдИ рдереАред рдпрд╣рд╛рдБ рдШрдЯрдирд╛ рд╣реИ:
рд▓рдореНрдмрджрд╛рд╕: C ++ 11 рд╕реЗ C ++ 20 - C ++ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕рдореВрд╣ рдХреНрд░рд╛рдХреЛ ред
рдореИрдВрдиреЗ рдереЙрдорд╕ рд╕реЗ рдХреЛрдб рд▓реЗрдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ (рдЙрдирдХреА рдЕрдиреБрдорддрд┐ рд╕реЗ!) рдФрд░ рдЗрд╕рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд▓реЗрдЦ рд▓рд┐рдЦрд╛ред рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЗ рдкрд╣рд▓реЗ рднрд╛рдЧ рдореЗрдВ рдореИрдВрдиреЗ рд▓реИрдореНрдмрдбрд╛ рдХреЗ рднрд╛рд╡реЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХреА:
- рдореВрд▓ рд╡рд╛рдХреНрдп рд░рдЪрдирд╛
- рд▓рдВрдмреЛрджрд░ рдкреНрд░рдХрд╛рд░
- рдХреЙрд▓ рдСрдкрд░реЗрдЯрд░
- рдЪрд░ (рдЙрддреНрдкрд░рд┐рд╡рд░реНрддрдиреАрдп, рд╡реИрд╢реНрд╡рд┐рдХ, рд╕реНрдерд┐рд░ рдЪрд░, рд╡рд░реНрдЧ рдХреЗ рд╕рджрд╕реНрдп рдФрд░ рдпрд╣ рд╕реВрдЪрдХ, рдЧрддрд┐-рд╕рдХреНрд╖рдо-рдХреЗрд╡рд▓ рдСрдмреНрдЬреЗрдХреНрдЯ, рд╕рдВрдЪрдп рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХрд╛рдВрд╕реНрдЯреЗрдмрд▓) рдХреИрдкреНрдЪрд░ рдХрд░рдирд╛:
- рд╡рд╛рдкрд╕реА рдкреНрд░рдХрд╛рд░
- IIFE - рддреБрд░рдВрдд рд▓рд╛рдЧреВ рд╕рдорд╛рд░реЛрд╣ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐
- рдлрд╝рдВрдХреНрд╢рди рдкреЙрдЗрдВрдЯрд░ рдореЗрдВ рд░реВрдкрд╛рдВрддрд░рдг
- рд╡рд╛рдкрд╕реА рдкреНрд░рдХрд╛рд░
- IIFE - рддреБрд░рдВрдд рд▓рд╛рдЧреВ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпрд╛рдБ
- рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдкреЙрдЗрдВрдЯрд░ рдореЗрдВ рдХрдирд╡рд░реНрдЯ рдХрд░реЗрдВ
- C ++ 14 рдореЗрдВ рд╕реБрдзрд╛рд░
- рд╡рд╛рдкрд╕реА рдкреНрд░рдХрд╛рд░ рдЖрдЙрдЯрдкреБрдЯ
- рдЗрдирд┐рд╢рд▓рд╛рдЗрдЬрд╝рд░ рдХреЗ рд╕рд╛рде рдХреИрдкреНрдЪрд░ рдХрд░реЗрдВ
- рдПрдХ рд╕рджрд╕реНрдп рдЪрд░ рдкрд░ рдХрдмреНрдЬрд╛
- рд╕рд╛рдорд╛рдиреНрдп рд▓рдВрдмреЛрджрд░ рднрд╛рд╡
рдЙрдкрд░реЛрдХреНрдд рд╕реВрдЪреА рд▓рдВрдмреЛрджрд░ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗ рдЗрддрд┐рд╣рд╛рд╕ рдХрд╛ рдХреЗрд╡рд▓ рдПрдХ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИ!
рдЕрдм рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ C ++ 17 рдореЗрдВ рдХреНрдпрд╛ рдмрджрд▓рд╛рд╡ рдЖрдпрд╛ рд╣реИ рдФрд░ C ++ 20 рдореЗрдВ рд╣рдореЗрдВ рдХреНрдпрд╛ рдорд┐рд▓рддрд╛ рд╣реИ!
C ++ 17 рдореЗрдВ рд╕реБрдзрд╛рд░рдорд╛рдирдХ (рдкреНрд░рдХрд╛рд╢рди рд╕реЗ рдкрд╣рд▓реЗ рдорд╕реМрджрд╛)
рд▓рдВрдмреЛрджрд░ рдкрд░
N659 рдЕрдиреБрднрд╛рдЧ:
[expr.prim.lambda] ред C ++ 17 рдиреЗ рд▓реИрдореНрдмреНрдбрд╛ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдореЗрдВ рджреЛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╕реБрдзрд╛рд░ рд▓рд╛рдП:
- constexpr рд▓рдВрдмреЛрджрд░
- рдЗрд╕ рдкрд░ рдХрдмреНрдЬрд╛ *
рдЗрди рдирд╡рд╛рдЪрд╛рд░реЛрдВ рдХрд╛ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдХреНрдпрд╛ рдорддрд▓рдм рд╣реИ? рдЪрд▓рд┐рдП рдЗрд╕рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рддреЗ рд╣реИрдВред
рдХреЙрдиреНрд╕реНрдЯреИрдХреНрд╕ рд▓реИрдореНрдмреНрдбрд╛ рдПрдХреНрд╕рдкреНрд░реЗрд╢рдиC ++ 17 рдХреЗ рд╕рд╛рде рд╢реБрд░реВ, рдорд╛рдирдХ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд
operator()
рдПрдХ рд▓реИрдореНрдмреНрдбрд╛ рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП
constexpr
рд░реВрдк рдореЗрдВ, рдпрджрд┐ рд╕рдВрднрд╡ рд╣реЛ рддреЛ:
Expr.prim.lambda рд╕реЗ # 4 :
рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдСрдкрд░реЗрдЯрд░ рдПрдХ рдХреЙрдиреНрд╕реНрдЯреНрд░реЗрдХреНрд╕ рдлрд╝рдВрдХреНрд╢рди рд╣реЛрддрд╛ рд╣реИ рдпрджрд┐ рд╕рдВрдмрдВрдзрд┐рдд рд▓реИрдореНрдмреНрдбрд╛ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреА рд╕реНрдерд┐рддрд┐ рдкреИрд░рд╛рдореАрдЯрд░ рдХреА рдШреЛрд╖рдгрд╛ рдХреЙрдиреНрд╕реНрдЯреИрдХреНрд╕ рдХреЗ рдмрд╛рдж рд╣реЛрддреА рд╣реИ, рдпрд╛ рдпрд╣ рдХреЙрдиреНрд╕реНрдЯреНрд░реЗрдХреНрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЛ рдкреВрд░рд╛ рдХрд░рддреА рд╣реИред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:
constexpr auto Square = [] (int n) { return n*n; }; // implicitly constexpr static_assert(Square(2) == 4);
рдпрд╛рдж рд░рдЦреЗрдВ рдХрд┐ C ++ 17 рдореЗрдВ
constexpr
рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдЗрди рдирд┐рдпрдореЛрдВ рдХрд╛ рдкрд╛рд▓рди рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП:
- рдпрд╣ рдЖрднрд╛рд╕реА рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП;
- рдЗрд╕рдХрд╛ рд╡рд╛рдкрд╕реА рдкреНрд░рдХрд╛рд░ рдПрдХ рд╢рд╛рдмреНрджрд┐рдХ рдкреНрд░рдХрд╛рд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП;
- рдЗрд╕рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдХрд╛ рд╢рд╛рдмреНрджрд┐рдХ рдкреНрд░рдХрд╛рд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП;
- рдЗрд╕рдХрд╛ рд╢рд░реАрд░ = рд╣рдЯрд╛рдирд╛, = рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдпрд╛ рдПрдХ рдпреМрдЧрд┐рдХ рд╡рд┐рд╡рд░рдг рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдЬрд┐рд╕рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рд╣реИ
- asm рдкрд░рд┐рднрд╛рд╖рд╛рдПрдБ
- рдЧреЛрдЯреЛ рдПрдХреНрд╕рдкреНрд░реЗрд╢рди,
- рд▓реЗрдмрд▓,
- рдмреНрд▓реЙрдХ рдпрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ
- рдПрдХ рдЧреИрд░-рд╢рд╛рдмреНрджрд┐рдХ рдЪрд░ рдХреА рдкрд░рд┐рднрд╛рд╖рд╛, рдПрдХ рд╕реНрдерд┐рд░ рдЪрд░, рдпрд╛ рдПрдХ рд╕реНрдЯреНрд░реАрдорд┐рдВрдЧ рдореЗрдореЛрд░реА рдЪрд░ рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдЖрд░рдВрднреАрдХрд░рдг рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдЕрдзрд┐рдХ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛?
template<typename Range, typename Func, typename T> constexpr T SimpleAccumulate(const Range& range, Func func, T init) { for (auto &&elem: range) { init += func(elem); } return init; } int main() { constexpr std::array arr{ 1, 2, 3 }; static_assert(SimpleAccumulate(arr, [](int i) { return i * i; }, 0) == 14); }
рдЖрдк рдпрд╣рд╛рдВ рдХреЛрдб рдХреЗ рд╕рд╛рде рдЦреЗрд▓ рд╕рдХрддреЗ рд╣реИрдВ:
@WandboxрдХреЛрдб
constexpr
lambda рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рдЗрд╕реЗ рд╕рд░рд▓
SimpleAccumulate
рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдореЗрдВ рдкрд╛рд╕ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХрдИ C ++ 17 рддрддреНрд╡реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ:
std::array
,
std::begin
constexpr
рдФрд░
std::end
(рдПрдХ рд╕реАрдорд╛ рдХреЗ рд╕рд╛рде рд▓реВрдк рдореЗрдВ рдкреНрд░рдпреБрдХреНрдд) рдХреЗ рд▓рд┐рдП
constexpr
рднреА рдЕрдм
constexpr
, рдЗрд╕рд▓рд┐рдП рдЗрд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рд╕рднреА рдХреЛрдб рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ рд╕рдВрдХрд▓рди рдХреЗ рд╕рдордпред
рдмреЗрд╢рдХ, рдпрд╣ рд╕рдм рдирд╣реАрдВ рд╣реИред
рдЖрдк рдЪрд░ рдкрд░ рдХрдмреНрдЬрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рдмрд╢рд░реНрддреЗ рдХрд┐ рд╡реЗ
constexpr
рднреА рд╣реЛрдВ):
constexpr int add(int const& t, int const& u) { return t + u; } int main() { constexpr int x = 0; constexpr auto lam = [x](int n) { return add(x, n); }; static_assert(lam(10) == 10); }
рд▓реЗрдХрд┐рди рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рдорд╛рдорд▓рд╛ рд╣реИ рдЬрдм рдЖрдк рдХреИрдкреНрдЪрд░ рдХрд┐рдП рдЧрдП рдЪрд░ рдХреЛ рдЖрдЧреЗ рдирд╣реАрдВ рдмрдврд╝рд╛рддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:
constexpr int x = 0; constexpr auto lam = [x](int n) { return n + x };
рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдХреНрд▓реИрдВрдЧ рдореЗрдВ рд╣рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЪреЗрддрд╛рд╡рдиреА рдорд┐рд▓ рд╕рдХрддреА рд╣реИ:
warning: lambda capture 'x' is not required to be captured for this use
рдпрд╣ рд╕рдВрднрд╡рддрдГ рдЗрд╕ рддрдереНрдп рдХреЗ рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдЙрдкрдпреЛрдЧ рдХреЗ рд╕рд╛рде рдПрдХреНрд╕ рдХреЛ рдЬрдЧрд╣ рдореЗрдВ рдмрджрд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (рдЬрдм рддрдХ рдХрд┐ рдЖрдк рдЗрд╕реЗ рдЖрдЧреЗ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ рдпрд╛ рдЗрд╕ рдирд╛рдо рдХрд╛ рдкрддрд╛ рдирд╣реАрдВ рд▓реЗрддреЗ рд╣реИрдВ)ред
рд▓реЗрдХрд┐рди рдХреГрдкрдпрд╛ рдореБрдЭреЗ рдмрддрд╛рдПрдВ рдХрд┐ рдХреНрдпрд╛ рдЖрдк рдЗрд╕ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЗ рд▓рд┐рдП рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рдирд┐рдпрдо рдЬрд╛рдирддреЗ рд╣реИрдВред рдореИрдВрдиреЗ рдХреЗрд╡рд▓ (
cppreference рд╕реЗ ) рдкрд╛рдпрд╛ (рд▓реЗрдХрд┐рди рдореИрдВ рдЗрд╕реЗ рдбреНрд░рд╛рдлреНрдЯ рдореЗрдВ рдирд╣реАрдВ рдкрд╛ рд╕рдХрддрд╛ ...)
(рдЕрдиреБрд╡рд╛рджрдХ рдХрд╛ рдзреНрдпрд╛рди рджреЗрдВ: рдЬреИрд╕рд╛ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рдардХ рд▓рд┐рдЦрддреЗ рд╣реИрдВ, рдореЗрд░рд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рд╣рд░ рдЬрдЧрд╣ рдкрд░ 'x' рдХреЗ рдореВрд▓реНрдп рдХреЛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛ рдЬрд╣рд╛рдВ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕реЗ рдмрджрд▓рдирд╛ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЕрд╕рдВрднрд╡ рд╣реИред)рдПрдХ рд▓реИрдореНрдмреНрдбрд╛ рдПрдХреНрд╕рдкреНрд░реЗрд╢рди рдХрд┐рд╕реА рд╡реЗрд░рд┐рдПрдмрд▓ рдХреЗ рд╡реИрд▓реНрдпреВ рдХреЛ рдмрд┐рдирд╛ рдХреИрдкреНрдЪрд░ рдХрд┐рдП рдкрдврд╝ рд╕рдХрддрд╛ рд╣реИ
* рдПрдХ рдирд┐рд░рдВрддрд░ non-volatile
рдкреВрд░реНрдгрд╛рдВрдХ рдпрд╛ рдкреНрд░рдЧрдгрд┐рдд рдкреНрд░рдХрд╛рд░ рд╣реИ рдФрд░ рдЗрд╕реЗ constexpr
рдпрд╛ рдХреЗ рд╕рд╛рде рдЖрд░рдВрднреАрдХреГрдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ
* constexpr
рдФрд░ рдХреЛрдИ constexpr
рд╕рджрд╕реНрдп рдирд╣реАрдВ рд╣реИредрднрд╡рд┐рд╖реНрдп рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд░рд╣реЗрдВ:
C ++ 20 рдореЗрдВ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдорд╛рдирдХ рдорд╛рдирдХ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рд╣реЛрдВрдЧреЗ рдФрд░, рд╕рдВрднрд╡рддрдГ, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдХреБрдЫ рдХрдВрдЯреЗрдирд░ рднреА, рдЗрд╕рд▓рд┐рдП рдЗрд╕ рд╕рдВрджрд░реНрдн рдореЗрдВ
constexpr
рд▓реИрдореНрдмреНрдбрд╛ рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛ред рдЖрдкрдХрд╛ рдХреЛрдб рд░рди-рдЯрд╛рдЗрдо рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд╕рд╛рде-рд╕рд╛рде
constexpr
рд╡рд░реНрдЬрди (рд╕рдВрдХрд▓рди-рд╕рдордп рд╕рдВрд╕реНрдХрд░рдг) рдХреЗ рд▓рд┐рдП рд╕рдорд╛рди рджрд┐рдЦреЗрдЧрд╛!
рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ:
constexpr
lambda рдЖрдкрдХреЛ рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХреЗ рдЕрдиреБрд░реВрдк рд╣реЛрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдФрд░ рд╕рдВрднрд╡рдд: рдЗрд╕рдХрд╛ рдХреЛрдб рдЫреЛрдЯрд╛ рд╣реЛрддрд╛ рд╣реИред
рдЕрдм C ++ 17 рдореЗрдВ рдЙрдкрд▓рдмреНрдз рджреВрд╕рд░реА рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╡рд┐рд╢реЗрд╖рддрд╛ рдкрд░ рдЪрд▓рддреЗ рд╣реИрдВ:
* рдЗрд╕ рдкрд░ рдХрдмреНрдЬрд╛рдЗрд╕ рдкрд░ рдХрдмреНрдЬрд╛ *рдХреНрдпрд╛ рдЖрдкрдХреЛ рд╣рдорд╛рд░реА рд╕рдорд╕реНрдпрд╛ рдпрд╛рдж рд╣реИ рдЬрдм рд╣рдо рдХрдХреНрд╖рд╛ рдХреЗ рдПрдХ рд╕рджрд╕реНрдп рдХреЛ рдкрдХрдбрд╝рдирд╛ рдЪрд╛рд╣рддреЗ рдереЗ? рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рд╣рдо рдЗрд╕реЗ (рдПрдХ рдкреЙрдЗрдВрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ!) рдХреИрдкреНрдЪрд░ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рд╕рдорд╕реНрдпрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИ рдЬрдм рдЕрд╕реНрдерд╛рдпреА рдСрдмреНрдЬреЗрдХреНрдЯ рд╕реНрдХреЛрдк рд╕реЗ рдмрд╛рд╣рд░ рдЬрд╛рддреЗ рд╣реИрдВ ... рдпрд╣ рдПрдХ рдЗрдирд┐рд╢рд▓рд╛рдЗрдЬрд╝рд░ рдХреЗ рд╕рд╛рде рдХреИрдкреНрдЪрд░ рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рддрдп рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХрд╛ рдкрд╣рд▓рд╛ рднрд╛рдЧ рджреЗрдЦреЗрдВ)ред рд▓реЗрдХрд┐рди рдЕрдм, C ++ 17 рдореЗрдВ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдЕрд▓рдЧ рддрд░реАрдХрд╛ рд╣реИред рд╣рдо рдЗрд╕реЗ * рдХреА рдПрдХ рдкреНрд░рддрд┐ рд▓рдкреЗрдЯ рд╕рдХрддреЗ рд╣реИрдВ:
рдЖрдк рдпрд╣рд╛рдВ рдХреЛрдб рдХреЗ рд╕рд╛рде рдЦреЗрд▓ рд╕рдХрддреЗ рд╣реИрдВ:
@WandboxрдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝рд░ рдХреЗ рд╕рд╛рде рдХреИрдкреНрдЪрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╡рд╛рдВрдЫрд┐рдд рд╕рджрд╕реНрдп рдЪрд░ рдХреЛ рдХреИрдкреНрдЪрд░ рдХрд░рдирд╛ рдЖрдкрдХреЛ рдЕрд╕реНрдерд╛рдпреА рдорд╛рдиреЛрдВ рдХреЗ рд╕рд╛рде рд╕рдВрднрд╛рд╡рд┐рдд рддреНрд░реБрдЯрд┐рдпреЛрдВ рд╕реЗ рдмрдЪрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЬрдм рд╣рдо рдПрдХ рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рддреЛ рд╣рдо рдРрд╕рд╛ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:
struct Baz { auto foo() { return [this] { print(); }; } void print() const { std::cout << s << '\n'; } std::string s; };
C ++ 14 рдореЗрдВ, рдХреЛрдб рд╕реБрд░рдХреНрд╖рд┐рдд рдмрдирд╛рдиреЗ рдХрд╛ рдПрдХрдорд╛рддреНрд░ рддрд░реАрдХрд╛
this
рдХрд┐ рдЗрд╕реЗ рдПрдХ рдЗрдирд┐рд╢рд▓рд╛рдЗрдЬрд╝рд░ рдХреЗ рд╕рд╛рде рдХреИрдкреНрдЪрд░ рдХрд┐рдпрд╛ рдЬрд╛рдП:
auto foo() { return [self=*this] { self.print(); }; } C ++ 17 : auto foo() { return [*this] { print(); }; }
рдПрдХ рдФрд░ рдмрд╛рдд:
рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдпрджрд┐ рдЖрдк рдПрдХ рд╕рджрд╕реНрдп рд╕рдорд╛рд░реЛрд╣ рдореЗрдВ
[=]
рд▓рд┐рдЦрддреЗ рд╣реИрдВ, рддреЛ
this
рдирд┐рд╣рд┐рдд рд╣реИ! рдЗрд╕рд╕реЗ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рддреНрд░реБрдЯрд┐рдпрд╛рдВ рд╣реЛ рд╕рдХрддреА рд╣реИрдВ ... рдФрд░ рдпрд╣ C ++ 20 рдореЗрдВ рдЕрдкреНрд░рдЪрд▓рд┐рдд рд╣реЛ рдЬрд╛рдПрдЧрд╛ред
рддреЛ рд╣рдо рдЕрдЧрд▓реЗ рднрд╛рдЧ рдкрд░ рдЖрддреЗ рд╣реИрдВ: рднрд╡рд┐рд╖реНрдпред
рд╕реА ++ 20 рдХреЗ рд╕рд╛рде рднрд╡рд┐рд╖реНрдпC ++ 20 рдореЗрдВ, рд╣рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд╛рд░реНрдп рдорд┐рд▓рддреЗ рд╣реИрдВ:
- рдЕрдиреБрдорддрд┐ рджреЗрдВ
[=, this]
рдПрдХ рд▓реИрдореНрдмреНрдбрд╛ рдХреИрдкреНрдЪрд░ рдХреЗ рд░реВрдк рдореЗрдВ - P0409R2 рдФрд░ рдЗрд╕ рдХреЗ рдирд┐рд╣рд┐рдд рдХреИрдкреНрдЪрд░ рдХреЛ [=]
- P0806 рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд░рджреНрдж рдХрд░реЗрдВ - рд▓реИрдВрдмрдбрд╛ рдЗрдирд┐рдЯ рдореЗрдВ рдкреИрдХреЗрдЬ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░
lambda init-capture: ... args = std::move (args)] () {}
- L08080 - рд╕реНрдерд┐рд░,
thread_local
рдФрд░ рд╕рдВрд░рдЪрд┐рдд рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рд▓реИрдореНрдмреНрдбрд╛ рдХреИрдкреНрдЪрд░ - P1091 - рд▓реИрдореНрдмреНрдбрд╛ рдкреИрдЯрд░реНрди (рдЕрд╡рдзрд╛рд░рдгрд╛рдУрдВ рдХреЗ рд╕рд╛рде рднреА) - P0428R2
- рд╕рд░рд▓реАрдХреГрдд рд▓рдВрдмреЛрджрд░ рдХреИрдкреНрдЪрд░ - P0588R1
- рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╕реНрдерд┐рддрд┐ рдХреЛ рд╕рд╣реЗрдЬреЗ рдмрд┐рдирд╛ рд░рдЪрдирд╛рддреНрдордХ рдФрд░ рдирд┐рдпрдд рд▓рдВрдмреЛрджрд░ - P0624R2
- рдПрдХ рдЕрд▓рдВрдХреГрдд рд╕рдВрджрд░реНрдн рдореЗрдВ рд▓рдореНрдмрджрд╛рд╕ - P0315R4
рдЬреНрдпрд╛рджрд╛рддрд░ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдирдП рдкреЗрд╢ рдХрд┐рдП рдЧрдП рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рд▓реИрдореНрдмрдбрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ "рд╕реНрдкрд╖реНрдЯ" рд╣реЛрддрд╛ рд╣реИ, рдФрд░ рд╡реЗ рдХреБрдЫ рдЙрдиреНрдирдд рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП,
P1091 рдХреЗ рд╕рд╛рде рдЖрдк рдПрдХ рд╕рдВрд░рдЪрд┐рдд рдмрдВрдзрди рдкрд░ рдХрдмреНрдЬрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЗрд╕реЗ рдХреИрдкреНрдЪрд░ рдХрд░рдиреЗ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рднреА рд╣реИрдВред C ++ 20 рдореЗрдВ, рдпрджрд┐ рдЖрдк рдПрдХ рд╡рд┐рдзрд┐ рдореЗрдВ
[=]
рдХреИрдкреНрдЪрд░ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдПрдХ рдЪреЗрддрд╛рд╡рдиреА рдорд┐рд▓реЗрдЧреА:
struct Baz { auto foo() { return [=] { std::cout << s << std::endl; }; } std::string s; }; GCC 9: warning: implicit capture of 'this' via '[=]' is deprecated in C++20
рдпрджрд┐ рдЖрдкрдХреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕ рдкрд░ рдХрдмреНрдЬрд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдЖрдкрдХреЛ
[=, this]
рд▓рд┐рдЦрдирд╛ рдЪрд╛рд╣рд┐рдПред
рдЙрдиреНрдирдд рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЛрдВ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдкрд░рд┐рд╡рд░реНрддрди рднреА рд╣реИрдВ, рдЬреИрд╕реЗ рдХрд┐ рд╕реНрдЯреЗрдЯрд▓реЗрд╕ рд╕рдВрджрд░реНрдн рдФрд░ рд╕реНрдЯреЗрдЯрд▓реЗрд╕ рд▓реИрдореНрдмреНрдбрд╛ рдЬреЛ рдХрд┐ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдирд┐рд░реНрдорд┐рдд рдХрд┐рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред
рджреЛрдиреЛрдВ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЗ рд╕рд╛рде рдЖрдк рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ:
std::map<int, int, decltype([](int x, int y) { return x > y; })> map;
рд╡рд╛рдХреНрдпреЛрдВ рдХреЗ рдкрд╣рд▓реЗ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рдЗрди рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдЙрджреНрджреЗрд╢реНрдп рдкрдврд╝реЗрдВ:
P0315R0 рдФрд░
P0624R0 ред
рд▓реЗрдХрд┐рди рдЖрдЗрдП рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рд╡рд┐рд╢реЗрд╖рддрд╛ рджреЗрдЦреЗрдВ: рд▓реИрдореНрдмреНрдбрд╛ рдЯреЗрдореНрдкрд▓реЗрдЯреНрд╕ред
рд▓реИрдореНрдмрдб рдкреИрдЯрд░реНрдиC ++ 14 рдореЗрдВ, рд╣рдореЗрдВ рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рд▓реИрдореНрдмреНрдбрд╛ рдорд┐рд▓рд╛, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдСрдЯреЛ рдХреЗ рд░реВрдк рдореЗрдВ рдШреЛрд╖рд┐рдд рдкреИрд░рд╛рдореАрдЯрд░ рдЯреЗрдореНрдкрд▓реЗрдЯ рдкреИрд░рд╛рдореАрдЯрд░ рд╣реИрдВред
рд▓рдВрдмреЛрджрд░ рдХреЗ рд▓рд┐рдП:
[](auto x) { x; }
рдХрдВрдкрд╛рдЗрд▓рд░ рдПрдХ рдХреЙрд▓ рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдмрдирд╛рддрд╛ рд╣реИ рдЬреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ рд╡рд┐рдзрд┐ рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИ:
template<typename T> void operator(T x) { x; }
рд▓реЗрдХрд┐рди рдЗрд╕ рдЯреЗрдореНрдкрд▓реЗрдЯ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рдмрджрд▓рдиреЗ рдФрд░ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЯреЗрдореНрдкрд▓реЗрдЯ рддрд░реНрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рдерд╛ред C ++ 20 рдореЗрдВ, рдпрд╣ рд╕рдВрднрд╡ рд╣реЛрдЧрд╛ред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рдо рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреЗ рд╡реИрдХреНрдЯрд░ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рд▓реИрдореНрдмреНрдбрд╛ рдХреЛ рдХреИрд╕реЗ рд╕реАрдорд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ?
рд╣рдо рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдореЗрдордирд╛ рд▓рд┐рдЦ тАЛтАЛрд╕рдХрддреЗ рд╣реИрдВ:
auto foo = []<typename T>(const auto& vec) { std::cout<< std::size(vec) << '\n'; std::cout<< vec.capacity() << '\n'; };
рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдЖрдк рдЗрд╕реЗ рдПрдХ рдЕрдВрддрд░ рдкреИрд░рд╛рдореАрдЯрд░ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП,
foo(10);
) рдХрд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдХреБрдЫ рдореБрд╢реНрдХрд┐рд▓ рд╕реЗ рдкрдврд╝рдиреЗ рдореЗрдВ рдХрдард┐рдирд╛рдИ рд╣реЛ рд╕рдХрддреА рд╣реИ:
prog.cc: In instantiation of 'main()::<lambda(const auto:1&)> [with auto:1 = int]': prog.cc:16:11: required from here prog.cc:11:30: error: no matching function for call to 'size(const int&)' 11 | std::cout<< std::size(vec) << '\n';
C ++ 20 рдореЗрдВ рд╣рдо рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ:
auto foo = []<typename T>(std::vector<T> const& vec) { std::cout<< std::size(vec) << '\n'; std::cout<< vec.capacity() << '\n'; };
рдЙрдкрд░реЛрдХреНрдд рд▓реИрдореНрдмреНрдбрд╛ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЙрд▓ рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ:
<typename T> void operator(std::vector<T> const& s) { ... }
рдЯреЗрдореНрдкрд▓реЗрдЯ рдкреИрд░рд╛рдореАрдЯрд░ рдХреИрдкреНрдЪрд░ рдХреНрд▓реЙрдЬ
[]
рдЕрдиреБрд╕рд░рдг рдХрд░рддрд╛ рд╣реИред
рдпрджрд┐ рдЖрдк рдЗрд╕реЗ
int (foo(10);)
, рддреЛ рдЖрдкрдХреЛ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╕рдВрджреЗрд╢ рдорд┐рд▓реЗрдЧрд╛:
note: mismatched types 'const std::vector<T>' and 'int'
рдЖрдк рдпрд╣рд╛рдВ рдХреЛрдб рдХреЗ рд╕рд╛рде рдЦреЗрд▓ рд╕рдХрддреЗ рд╣реИрдВ:
@WandboxрдЙрдкрд░реЛрдХреНрдд рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рд╕рдВрдХрд▓рдХ рд╣рдореЗрдВ рд▓реИрдореНрдмрдбрд╛ рдЗрдВрдЯрд░рдлреЗрд╕ рдореЗрдВ рд╡рд┐рд╕рдВрдЧрддрд┐рдпреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╢рд░реАрд░ рдХреЗ рдЕрдВрджрд░ рдХреЗ рдХреЛрдб рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЪреЗрддрд╛рд╡рдиреА рджреЗ рд╕рдХрддрд╛ рд╣реИред
рдПрдХ рдФрд░ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдкрд╣рд▓реВ рдпрд╣ рд╣реИ рдХрд┐ рдПрдХ рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рд▓рдВрдмреЛ рдореЗрдВ рдЖрдкрдХреЗ рдкрд╛рд╕ рдХреЗрд╡рд▓ рдПрдХ рдЪрд░ рд╣реИ, рди рдХрд┐ рдЗрд╕рдХрд╛ рдЯреЗрдореНрдкрд▓реЗрдЯ рдкреНрд░рдХрд╛рд░ред рдЗрд╕рд▓рд┐рдП, рдпрджрд┐ рдЖрдк рдЗрд╕реЗ рдПрдХреНрд╕реЗрд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдбрд┐рдХреНрдЯрд╛рдЗрдк (x) (рддрд░реНрдХ рдХреЗ рд╕рд╛рде рд▓рдВрдмреЛрджрд░ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗ рд▓рд┐рдП) (рдСрдЯреЛ x) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдпрд╣ рдХреБрдЫ рдХреЛрдб рдХреЛ рдЕрдзрд┐рдХ рдХреНрд░рд┐рдпрд╛рддреНрдордХ рдФрд░ рдЬрдЯрд┐рд▓ рдмрдирд╛рддрд╛ рд╣реИред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП (P0428 рд╕реЗ рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ):
auto f = [](auto const& x) { using T = std::decay_t<decltype(x)>; T copy = x; T::static_function(); using Iterator = typename T::iterator; }
рдЕрдм рдЖрдк рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ:
auto f = []<typename T>(T const& x) { T::static_function(); T copy = x; using Iterator = typename T::iterator; }
рдЙрдкрд░реЛрдХреНрдд рдЕрдиреБрднрд╛рдЧ рдореЗрдВ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ C ++ 20 рдХрд╛ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд╡рд┐рд╡рд░рдг рдерд╛, рд▓реЗрдХрд┐рди рдореЗрд░реЗ рдкрд╛рд╕ рдЖрдкрдХреЗ рд▓рд┐рдП рдПрдХ рдФрд░ рдЕрддрд┐рд░рд┐рдХреНрдд рдЙрдкрдпреЛрдЧ рдХрд╛ рдорд╛рдорд▓рд╛ рд╣реИред рдпрд╣ рддрдХрдиреАрдХ C ++ 14 рдореЗрдВ рднреА рд╕рдВрднрд╡ рд╣реИред рддреЛ рдкрд░ рдкрдврд╝реЗрдВ
рдмреЛрдирд╕ - рд▓реИрдореНрдмреНрдбрд╛ рдХреЗ рд╕рд╛рде рд▓рд┐рдлреНрдЯрд┐рдВрдЧрд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдПрдХ рд╕рдорд╕реНрдпрд╛ рд╣реИ рдЬрдм рдЖрдкрдХреЗ рдкрд╛рд╕ рдлрд╝рдВрдХреНрд╢рди рдУрд╡рд░рд▓реЛрдб рд╣реИрдВ рдФрд░ рдЖрдк рдЙрдиреНрд╣реЗрдВ рдорд╛рдирдХ рдПрд▓реНрдЧреЛрд░рд┐рджрдо (рдпрд╛ рдХреБрдЫ рднреА рдЬрд┐рд╕реЗ рдХреБрдЫ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ) рдореЗрдВ рдкрд╛рд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ:
// two overloads: void foo(int) {} void foo(float) {} int main() { std::vector<int> vi; std::for_each(vi.begin(), vi.end(), foo); }
рд╣рдореЗрдВ GCC 9 (рдЯреНрд░рдВрдХ) рд╕реЗ рдирд┐рдореНрди рддреНрд░реБрдЯрд┐ рдорд┐рд▓рддреА рд╣реИ:
error: no matching function for call to for_each(std::vector<int>::iterator, std::vector<int>::iterator, <unresolved overloaded function type>) std::for_each(vi.begin(), vi.end(), foo); ^^^^^
рд╣рд╛рд▓рд╛рдВрдХрд┐, рдПрдХ рдЪрд╛рд▓ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╣рдо рдПрдХ рд▓рдВрдмреЛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдлрд┐рд░ рд╡рд╛рдВрдЫрд┐рдд рдЕрдзрд┐рднрд╛рд░ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдореВрд▓ рд░реВрдк рдореЗрдВ, рд╕рд░рд▓ рдореВрд▓реНрдп рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП, рд╣рдорд╛рд░реЗ рджреЛ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП, рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ:
std::for_each(vi.begin(), vi.end(), [](auto x) { return foo(x); });
рдФрд░ рд╕рдмрд╕реЗ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рдореЗрдВ, рд╣рдореЗрдВ рдереЛрдбрд╝рд╛ рдФрд░ рдЯрд╛рдЗрдк рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
рдмрд╣реБрдд рдЬрдЯрд┐рд▓ рдХреЛрдб ... рд╕рд╣реА? :)
рдЖрдЗрдП рдЗрд╕реЗ рдбрд┐рдХреНрд░рд┐рдкреНрдЯ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ:
рд╣рдо рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рд▓реИрдореНрдмреНрдбрд╛ рдмрдирд╛рддреЗ рд╣реИрдВ рдФрд░ рдлрд┐рд░ рд╣рдорд╛рд░реЗ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рд╛рдкреНрдд рд╕рднреА рддрд░реНрдХреЛрдВ рдХреЛ рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕реЗ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ noexcept рдФрд░ рд╡рд╛рдкрд╕реА рдорд╛рди рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдХреЙрд▓рд┐рдВрдЧ рдХреЛрдб рдХреЛ рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ - рддрд╛рдХрд┐ рд╕рд╣реА рдкреНрд░рдХрд╛рд░ рдорд┐рд▓ рд╕рдХреЗред
рдРрд╕реЗ LIFT рдореИрдХреНрд░реЛ рдХрд┐рд╕реА рднреА рдХрдВрдкрд╛рдЗрд▓рд░ рдореЗрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдЬреЛ C ++ 14 рдХреЛ рд╕рдкреЛрд░реНрдЯ рдХрд░рддрд╛ рд╣реИред
рдЖрдк рдпрд╣рд╛рдВ рдХреЛрдб рдХреЗ рд╕рд╛рде рдЦреЗрд▓ рд╕рдХрддреЗ рд╣реИрдВ:
@Wandboxрдирд┐рд╖реНрдХрд░реНрд╖рдЗрд╕ рдкреЛрд╕реНрдЯ рдореЗрдВ, рд╣рдордиреЗ C ++ 17 рдореЗрдВ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрджрд▓рд╛рд╡реЛрдВ рдХреЛ рджреЗрдЦрд╛, рдФрд░ C ++ 20 рдореЗрдВ рдирдИ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХрд╛ рдЕрд╡рд▓реЛрдХрди рджрд┐рдпрд╛ред
рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рднрд╛рд╖рд╛ рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХреЗ рд╕рд╛рде, рд▓реИрдореНрдмрдбрд╛ рдХреЗ рднрд╛рд╡ рдЕрдиреНрдп C ++ рддрддреНрд╡реЛрдВ рдХреЗ рд╕рд╛рде рдорд┐рд╢реНрд░рд┐рдд рд╣реЛрддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, C ++ 17 рд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо рдЙрдиреНрд╣реЗрдВ рдХреЙрдиреНрд╕реНрдЯреИрдХреНрд╕ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рдереЗ, рд▓реЗрдХрд┐рди рдЕрдм рдпрд╣ рд╕рдВрднрд╡ рд╣реИред рдЗрд╕реА рддрд░рд╣ рдЬреЗрдиреЗрд░рд┐рдХ рд▓реИрдореНрдмреНрдбрд╛ рдХреЗ рд╕рд╛рде C ++ 14 рд╕реЗ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ рдФрд░ рдЯреЗрдореНрдкрд▓реЗрдЯ рд▓реИрдореНрдмрдбрд╛ рдХреЗ рд░реВрдк рдореЗрдВ C ++ 20 рдореЗрдВ рдЙрдирдХрд╛ рд╡рд┐рдХрд╛рд╕ рд╣реЛрддрд╛ рд╣реИред рдХреНрдпрд╛ рдореБрдЭреЗ рдХреБрдЫ рдпрд╛рдж рдЖ рд░рд╣рд╛ рд╣реИ? рд╢рд╛рдпрдж рдЖрдкрдХреЗ рдкрд╛рд╕ рдХреБрдЫ рд░реЛрдорд╛рдВрдЪрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИрдВ? рдХреГрдкрдпрд╛ рдореБрдЭреЗ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рдмрддрд╛рдПрдВ!
рд╕рдВрджрд░реНрднC ++ 11 -
[expr.prim.lambda]C ++ 14 -
[expr.prim.lambda]C ++ 17 -
[expr.prim.lambda]C ++ рдореЗрдВ рд▓реИрдВрдмрдбрд╛ рдПрдХреНрд╕рдкреНрд░реЗрд╢рдВрд╕ | Microsoft рдбреЙрдХреНрд╕рд╕рд╛рдЗрдорди рдмреНрд░рд╛рдВрдб -
рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдУрд╡рд░рд▓реЛрдб рд╕реЗрдЯ рдкрд╛рд╕ рдХрд░рдирд╛рдЬреЗрд╕рди рдЯрд░реНрдирд░ -
рд╕реА ++ рд╡реАрдХрд▓реА - рдПрдк 128 - рд▓реЗрдореНрдмрдбрд╛ рдХреЗ рд▓рд┐рдП рд╕реА ++ 20 рдХрд╛ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рд╕рд┐рдВрдЯреИрдХреНрд╕рдЬреЗрд╕рди рдЯрд░реНрдирд░ -
рд╕реА ++ рд╡реАрдХрд▓реА - рдПрдк 41 - рд╕реА ++ 17 рдХрд╛ рдХреЙрдиреНрд╕реНрдЯреНрд░реЗрдХреНрд╕ рд▓реИрдВрдмрдбрд╛ рд╕рдкреЛрд░реНрдЯрд╣рдо рд╕рднреА рдХреЛ рдкрд╛рдареНрдпрдХреНрд░рдо рдкрд░ рдкрд╛рд░рдВрдкрд░рд┐рдХ
рдореБрдлреНрдд рд╡реЗрдмрд┐рдирд╛рд░ рдХреЗ рд▓рд┐рдП рдЖрдордВрддреНрд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рдХрд▓ 14 рдЬреВрди рдХреЛ рд╣реЛрдЧрд╛ред