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

рд╣рд╛рдп, рд╣рдмреНрд░реЛрд╕реНрдХред рдкрд╛рдареНрдпрдХреНрд░рдо "рд╕реА ++ рдбреЗрд╡рд▓рдкрд░" рдореЗрдВ рдПрдХ рдирдП рд╕рдореВрд╣ рдореЗрдВ рднрд░реНрддреА рдХреА рд╢реБрд░реБрдЖрдд рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ, рд╣рдо рдЖрдкрдХреЗ рд╕рд╛рде рд▓реЗрдЦ рдХреЗ рджреВрд╕рд░реЗ рднрд╛рдЧ "рд▓реИрдореНрдмреНрдбрд╛рд╕: рд╕реА ++ 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 рдореЗрдВ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдЕрд▓рдЧ рддрд░реАрдХрд╛ рд╣реИред рд╣рдо рдЗрд╕реЗ * рдХреА рдПрдХ рдкреНрд░рддрд┐ рд▓рдкреЗрдЯ рд╕рдХрддреЗ рд╣реИрдВ:

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

рдЖрдк рдпрд╣рд╛рдВ рдХреЛрдб рдХреЗ рд╕рд╛рде рдЦреЗрд▓ рд╕рдХрддреЗ рд╣реИрдВ: @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); }); 

рдФрд░ рд╕рдмрд╕реЗ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рдореЗрдВ, рд╣рдореЗрдВ рдереЛрдбрд╝рд╛ рдФрд░ рдЯрд╛рдЗрдк рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:

 #define LIFT(foo) \ [](auto&&... x) \ noexcept(noexcept(foo(std::forward<decltype(x)>(x)...))) \ -> decltype(foo(std::forward<decltype(x)>(x)...)) \ { return foo(std::forward<decltype(x)>(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 рдЬреВрди рдХреЛ рд╣реЛрдЧрд╛ред

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


All Articles