C++ рд░реВрд╕: рдпреЛ рдХрд╕рд░реА рднрдпреЛ

рдпрджрд┐ рдирд╛рдЯрдХрдХреЛ рд╕реБрд░реБрдорд╛ рддрдкрд╛рдИрдВрд▓реЗ рднрд┐рддреНрддрд╛рдорд╛ C++ рдХреЛрдб рдЭреБрдгреНрдбрд┐рдПрдХреЛ рдЫ рднрдиреА рднрдиреНрдиреБрднрдпреЛ рднрдиреЗ рдЕрдиреНрддреНрдпрдорд╛ рддрдкрд╛рдИрдВрд▓рд╛рдИ рдЦреБрдЯреНрдЯрд╛рдорд╛ рдЧреЛрд▓реА рд╣рд╛рдиреНрди рдмрд╛рдзреНрдп рд╣реБрдиреНрдЫред

Bjarne Stroustrup

рдЕрдХреНрдЯреЛрдмрд░ 31 рджреЗрдЦрд┐ рдиреЛрднреЗрдореНрдмрд░ 1 рд╕рдореНрдо, C++ рд░рд╕рд┐рдпрд╛ рдкрд┐рдЯрд░ рд╕рдореНрдореЗрд▓рди рд╕реЗрдиреНрдЯ рдкрд┐рдЯрд░реНрд╕рдмрд░реНрдЧрдорд╛ рдЖрдпреЛрдЬрд┐рдд рднрдпреЛ - JUG Ru рд╕рдореВрд╣рджреНрд╡рд╛рд░рд╛ рдЖрдпреЛрдЬрд┐рдд рд░реВрд╕рдорд╛ рдареВрд▓реЛ рд╕реНрддрд░рдХреЛ рдХрд╛рд░реНрдпрдХреНрд░рдо рд╕рдореНрдореЗрд▓рдирд╣рд░реВ рдордзреНрдпреЗ рдПрдХред рдЕрддрд┐рдерд┐ рд╡рдХреНрддрд╛рд╣рд░реВрд▓реЗ C++ рдорд╛рдирдХ рд╕рдорд┐рддрд┐рдХрд╛ рд╕рджрд╕реНрдпрд╣рд░реВ, CppCon рд╕реНрдкрд┐рдХрд░рд╣рд░реВ, O'Reilly рдкреБрд╕реНрддрдХ рд▓реЗрдЦрдХрд╣рд░реВ, рд░ LLVM, libc++, рд░ рдмреВрд╕реНрдЯ рдЬрд╕реНрддрд╛ рдкрд░рд┐рдпреЛрдЬрдирд╛рд╣рд░реВрдХреЛ рдорд░реНрдорддрдХрд░реНрддрд╛рд╣рд░реВ рд╕рдорд╛рд╡реЗрд╢ рдЧрд░реНрджрдЫред рд╕рдореНрдореЗрд▓рдирдХреЛ рдЙрджреНрджреЗрд╢реНрдп рдЕрдиреБрднрд╡реА C++ рд╡рд┐рдХрд╛рд╕рдХрд░реНрддрд╛рд╣рд░реВ рд╣реЛ рдЬрд╕рд▓реЗ рдЖрдлреНрдиреЛ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛рд▓рд╛рдИ рдЕрдЭ рдЧрд╣рд┐рд░реЛ рдмрдирд╛рдЙрди рд░ рдкреНрд░рддреНрдпрдХреНрд╖ рд╕рдЮреНрдЪрд╛рд░рдорд╛ рдЕрдиреБрднрд╡рд╣рд░реВ рдЖрджрд╛рдирдкреНрд░рджрд╛рди рдЧрд░реНрди рдЪрд╛рд╣рдиреНрдЫрдиреНред рд╡рд┐рджреНрдпрд╛рд░реНрдереАрд╣рд░реВ, рд╕реНрдирд╛рддрдХ рд╡рд┐рджреНрдпрд╛рд░реНрдереАрд╣рд░реВ рд░ рд╡рд┐рд╢реНрд╡рд╡рд┐рджреНрдпрд╛рд▓рдпрдХрд╛ рд╢рд┐рдХреНрд╖рдХрд╣рд░реВрд▓рд╛рдИ рдзреЗрд░реИ рд░рд╛рдореНрд░реЛ рдЫреБрдЯрд╣рд░реВ рдкреНрд░рджрд╛рди рдЧрд░рд┐рдиреНрдЫред

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

C++ рд░реВрд╕: рдпреЛ рдХрд╕рд░реА рднрдпреЛ

рдмрд╛рдЯ рдлреЛрдЯреЛ рд╕рдореНрдореЗрд▓рди рдПрд▓реНрдмрдо

╨Ю ╨╜╨░╤Б

рдиреЗрд╢рдирд▓ рд░рд┐рд╕рд░реНрдЪ рдпреБрдирд┐рднрд░реНрд╕рд┐рдЯреА рд╣рд╛рдпрд░ рд╕реНрдХреВрд▓ рдЕрдл рдЗрдХреЛрдиреЛрдорд┐рдХреНрд╕ - рд╕реЗрдиреНрдЯ рдкреАрдЯрд░реНрд╕рдмрд░реНрдЧрдХрд╛ рджреБрдИ рд╡рд┐рджреНрдпрд╛рд░реНрдереАрд╣рд░реВрд▓реЗ рдпрд╕ рдкреЛрд╕реНрдЯрдорд╛ рдХрд╛рдо рдЧрд░реЗ:

  • Liza Vasilenko рдПрдкреНрд▓рд╛рдЗрдб рдЧрдгрд┐рдд рд░ рдХрдореНрдкреНрдпреВрдЯрд░ рд╡рд┐рдЬреНрдЮрд╛рди рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЛ рдПрдХ рднрд╛рдЧ рдХреЛ рд░реВрдк рдорд╛ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛рд╣рд░реБ рдХреЛ рдЕрдзреНрдпрдпрди рдХреЛ 4th рд╡рд░реНрд╖ рд╕реНрдирд╛рддрдХ рд╡рд┐рджреНрдпрд╛рд░реНрдереА рд╣реЛред рд╡рд┐рд╢реНрд╡рд╡рд┐рджреНрдпрд╛рд▓рдпрдорд╛ рдореЗрд░реЛ рдкрд╣рд┐рд▓реЛ рд╡рд░реНрд╖рдорд╛ C++ рднрд╛рд╖рд╛рд╕рдБрдЧ рдкрд░рд┐рдЪрд┐рдд рднрдПрдкрдЫрд┐, рдореИрд▓реЗ рдкрдЫрд┐ рдЙрджреНрдпреЛрдЧрдорд╛ рдЗрдиреНрдЯрд░реНрдирд╢рд┐рдкрд╣рд░реВ рдорд╛рд░реНрдлрдд рдпрд╕рд╕рдБрдЧ рдХрд╛рдо рдЧрд░реНрдиреЗ рдЕрдиреБрднрд╡ рдкреНрд░рд╛рдкреНрдд рдЧрд░реЗрдВред рд╕рд╛рдорд╛рдиреНрдпрддрдпрд╛ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдЩ рднрд╛рд╖рд╛рд╣рд░реВ рд░ рд╡рд┐рд╢реЗрд╖ рдЧрд░реА рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдЩрдХреЛ рд▓рд╛рдЧрд┐ рдЬреБрдиреВрдирд▓реЗ рд╕рдореНрдореЗрд▓рдирдорд╛ рд░рд┐рдкреЛрд░реНрдЯрд╣рд░реВрдХреЛ рдЫрдиреЛрдЯрдорд╛ рдЖрдлреНрдиреЛ рдЫрд╛рдк рдЫреЛрдбреНрдпреЛред
  • Danya Smirnov рдорд╛рд╕реНрдЯрд░ рдХрд╛рд░реНрдпрдХреНрд░рдо "рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдЩ рд░ рдбрд╛рдЯрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг" рдХреЛ 1st рд╡рд░реНрд╖ рд╡рд┐рджреНрдпрд╛рд░реНрдереА рд╣реЛред рд╕реНрдХреВрд▓рдорд╛ рдЫрдБрджрд╛, рдореИрд▓реЗ C++ рдорд╛ рдУрд▓рдореНрдкрд┐рдпрд╛рдб рд╕рдорд╕реНрдпрд╛рд╣рд░реВ рд▓реЗрдЦреЗрдВ, рд░ рддреНрдпрд╕рдкрдЫрд┐ рдпреЛ рдХреБрдиреИ рди рдХреБрдиреИ рд░реВрдкрдорд╛ рднрдпреЛ рдХрд┐ рднрд╛рд╖рд╛ рдирд┐рд░рдиреНрддрд░ рд╢реИрдХреНрд╖рд┐рдХ рдЧрддрд┐рд╡рд┐рдзрд┐рд╣рд░реВрдорд╛ рдЖрдпреЛ рд░ рдЕрдиреНрддрддрдГ рдореБрдЦреНрдп рдХрд╛рд░реНрдп рднрд╛рд╖рд╛ рдмрдиреНрдпреЛред рдореИрд▓реЗ рдЖрдлреНрдиреЛ рдЬреНрдЮрд╛рди рд╕реБрдзрд╛рд░ рдЧрд░реНрди рд░ рдирдпрд╛рдБ рдЕрд╡рд╕рд░рд╣рд░реВрдХреЛ рдмрд╛рд░реЗрдорд╛ рдкрдирд┐ рдЬрд╛рдиреНрдирдХреЛ рд▓рд╛рдЧрд┐ рд╕рдореНрдореЗрд▓рдирдорд╛ рднрд╛рдЧ рд▓рд┐рдиреЗ рдирд┐рд░реНрдгрдп рдЧрд░реЗрдВред

рдиреНрдпреВрдЬрд▓реЗрдЯрд░рдорд╛, рд╕рдВрдХрд╛рдп рдиреЗрддреГрддреНрд╡рд▓реЗ рдкреНрд░рд╛рдпрдГ рд╣рд╛рдореНрд░реЛ рд╡рд┐рд╢реЗрд╖рддрд╛рд╕рдБрдЧ рд╕рдореНрдмрдиреНрдзрд┐рдд рд╢реИрдХреНрд╖рд┐рдХ рдШрдЯрдирд╛рд╣рд░реВрдХреЛ рдмрд╛рд░реЗрдорд╛ рдЬрд╛рдирдХрд╛рд░реА рд╕рд╛рдЭрд╛ рдЧрд░реНрджрдЫред рд╕реЗрдкреНрдЯреЗрдореНрдмрд░рдорд╛ рд╣рд╛рдореАрд▓реЗ C++ рд░реВрд╕рдХреЛ рдмрд╛рд░реЗрдорд╛ рдЬрд╛рдирдХрд╛рд░реА рджреЗрдЦреНрдпреМрдВ рд░ рд╢реНрд░реЛрддрд╛рд╣рд░реВрдХреЛ рд░реВрдкрдорд╛ рджрд░реНрддрд╛ рдЧрд░реНрдиреЗ рдирд┐рд░реНрдгрдп рдЧрд░реНрдпреМрдВред рдпрд╕реНрддрд╛ рд╕рдореНрдореЗрд▓рдирдорд╛ рднрд╛рдЧ рд▓рд┐рдиреЗ рд╣рд╛рдореНрд░реЛ рдкрд╣рд┐рд▓реЛ рдЕрдиреБрднрд╡ рд╣реЛ ред

рд╕рдореНрдореЗрд▓рди рд╕рдВрд░рдЪрдирд╛

  • рд░рд┐рдкреЛрд░реНрдЯрд╣рд░реВ

рджреБрдИ рджрд┐рдирдХреЛ рдЕрд╡рдзрд┐рдорд╛, рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрд╣рд░реВрд▓реЗ рдзреЗрд░реИ рддрд╛рддреЛ рд╡рд┐рд╖рдпрд╣рд░реВ рд╕рдореЗрдЯреЗрд░ 30 рд╡рдЯрд╛ рд░рд┐рдкреЛрд░реНрдЯрд╣рд░реВ рдкрдвреЗ: рд▓рд╛рдЧреВ рд╕рдорд╕реНрдпрд╛рд╣рд░реВ рд╕рдорд╛рдзрд╛рди рдЧрд░реНрди рднрд╛рд╖рд╛ рд╕реБрд╡рд┐рдзрд╛рд╣рд░реВрдХреЛ рд╕рд░рд▓ рдкреНрд░рдпреЛрдЧ, рдирдпрд╛рдБ рдорд╛рдирдХрдХреЛ рд╕рдореНрдмрдиреНрдзрдорд╛ рдЖрдЧрд╛рдореА рднрд╛рд╖рд╛ рдЕрджреНрдпрд╛рд╡рдзрд┐рдХрд╣рд░реВ, C++ рдбрд┐рдЬрд╛рдЗрдирдорд╛ рд╕рдореНрдЭреМрддрд╛ рд░ рддрд┐рдиреАрд╣рд░реВрдХрд╛ рдкрд░рд┐рдгрд╛рдорд╣рд░реВрд╕рдБрдЧ рдХрд╛рдо рдЧрд░реНрджрд╛ рд╕рд╛рд╡рдзрд╛рдиреАрд╣рд░реВ, рдЙрджрд╛рд╣рд░рдгрд╣рд░реВред рд░реЛрдЪрдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╡рд╛рд╕реНрддреБрдХрд▓рд╛рдХреЛ, рд╕рд╛рдереИ рднрд╛рд╖рд╛ рдкреВрд░реНрд╡рд╛рдзрд╛рд░рдХреЛ рдХреЗрд╣реА рдЕрдиреНрдбрд░-рдж-рд╣реБрдб рд╡рд┐рд╡рд░рдгрд╣рд░реВред рддреАрди рдкреНрд░рджрд░реНрд╢рдирд╣рд░реВ рдПрдХреИрд╕рд╛рде рднрдП, рдкреНрд░рд╛рдпрдГ рджреБрдИ рд░реВрд╕реА рд░ рдПрдХ рдЕрдВрдЧреНрд░реЗрдЬреАрдорд╛ред

  • рдЫрд▓рдлрд▓ рдХреНрд╖реЗрддреНрд░рд╣рд░реВ

рднрд╛рд╖рдг рдкрдЫрд┐, рд╕рдмреИ рди рд╕реЛрдзрд┐рдПрдХрд╛ рдкреНрд░рд╢реНрдирд╣рд░реВ рд░ рдЕрдзреВрд░рд╛ рдЫрд▓рдлрд▓рд╣рд░реВ рдорд╛рд░реНрдХрд░ рдмреЛрд░реНрдбрд╣рд░реВрд╕рдБрдЧ рд╕реБрд╕рдЬреНрдЬрд┐рдд рд╕реНрдкрд┐рдХрд░рд╣рд░реВрд╕рдБрдЧ рд╕рдЮреНрдЪрд╛рд░рдХреЛ рд▓рд╛рдЧрд┐ рд╡рд┐рд╢реЗрд╖ рд░реВрдкрдорд╛ рддреЛрдХрд┐рдПрдХреЛ рдХреНрд╖реЗрддреНрд░рдорд╛ рд╕реНрдерд╛рдирд╛рдиреНрддрд░рдг рдЧрд░рд┐рдпреЛред рд░рдорд╛рдЗрд▓реЛ рдХреБрд░рд╛рдХрд╛рдиреАрдХреЛ рд╕рд╛рде рднрд╛рд╖рдгрд╣рд░реВ рдмреАрдЪрдХреЛ рдмреНрд░реЗрдХрд▓рд╛рдИ рдЯрд╛рдврд╛ рд░рд╛рдЦреНрдирдХреЛ рд▓рд╛рдЧрд┐ рд░рд╛рдореНрд░реЛ рддрд░рд┐рдХрд╛ред

  • рдмрд┐рдЬреБрд▓реА рд╡рд╛рд░реНрддрд╛ рд░ рдЕрдиреМрдкрдЪрд╛рд░рд┐рдХ рдЫрд▓рдлрд▓

рдпрджрд┐ рддрдкрд╛рдЗрдБ рдЫреЛрдЯреЛ рд░рд┐рдкреЛрд░реНрдЯ рджрд┐рди рдЪрд╛рд╣рд╛рдиреБрд╣реБрдиреНрдЫ рднрдиреЗ, рддрдкрд╛рдЗрдБ рд╕рд╛рдБрдЭрдХреЛ рд▓рд╛рдЗрдЯрдирд┐рдЩ рдЯрдХрдХреЛ рд▓рд╛рдЧрд┐ рд╡реНрд╣рд╛рдЗрдЯрдмреЛрд░реНрдбрдорд╛ рд╕рд╛рдЗрди рдЕрдк рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ рд░ рд╕рдореНрдореЗрд▓рдирдХреЛ рд╡рд┐рд╖рдпрдорд╛ рдХреБрдиреИ рдкрдирд┐ рдХреБрд░рд╛рдХреЛ рдмрд╛рд░реЗрдорд╛ рдХреБрд░рд╛ рдЧрд░реНрди рдкрд╛рдБрдЪ рдорд┐рдиреЗрдЯ рд╕рдордп рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫред рдЙрджрд╛рд╣рд░рдгрдХрд╛ рд▓рд╛рдЧрд┐, C++ рдХреЛ рд▓рд╛рдЧрд┐ рд╕реЗрдирд┐рдЯрд╛рдЗрдЬрд░рд╣рд░реВрдХреЛ рджреНрд░реБрдд рдкрд░рд┐рдЪрдп (рдХреЗрд╣реАрдХрд╛ рд▓рд╛рдЧрд┐ рдпреЛ рдирдпрд╛рдБ рдерд┐рдпреЛ) рд╡рд╛ рд╕рд╛рдЗрди рд╡реЗрдн рдЬреЗрдирд░реЗрд╢рдирдорд╛ рдмрдЧрдХреЛ рдмрд╛рд░реЗрдорд╛ рдХрдерд╛ рдЬреБрди рд╕реБрдиреНрди рд╕рдХрд┐рдиреНрдЫ, рддрд░ рджреЗрдЦреНрди рд╕рдХрд┐рдБрджреИрдиред

рдЕрд░реНрдХреЛ рдврд╛рдБрдЪрд╛ рдкреНрдпрд╛рдирд▓ рдЫрд▓рдлрд▓ рд╣реЛ "рд╣рд╛рд░реНрдЯ рдЯреБ рд╣рд╛рд░реНрдЯ рдХрдорд┐рдЯреАрд╕рдБрдЧред" рд╕реНрдЯреЗрдЬрдорд╛ рдорд╛рдирдХреАрдХрд░рдг рд╕рдорд┐рддрд┐рдХрд╛ рдХреЗрд╣реА рд╕рджрд╕реНрдпрд╣рд░реВ рдЫрдиреН, рдкреНрд░реЛрдЬреЗрдХреНрдЯрд░рдорд╛ рдлрд╛рдпрд░рдкреНрд▓реЗрд╕ рдЫ (рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рд░реВрдкрдорд╛ - рдПрдХ рдирд┐рд╖реНрдХрдкрдЯ рд╡рд╛рддрд╛рд╡рд░рдг рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрди, рддрд░ рдХрд╛рд░рдг "рдХрд┐рдирдХрд┐ рд╕рдмреИ рдХреБрд░рд╛ рдЖрдЧреЛрдорд╛ рдЫ" рд░рдорд╛рдИрд▓реЛ рджреЗрдЦрд┐рдиреНрдЫ), рдорд╛рдирдХ рд░ C++ рдХреЛ рд╕рд╛рдорд╛рдиреНрдп рджреГрд╖реНрдЯрд┐рдХреЛрдгрдХреЛ рдмрд╛рд░реЗрдорд╛ рдкреНрд░рд╢реНрдирд╣рд░реВред , рддрд╛рддреЛ рдкреНрд░рд╛рд╡рд┐рдзрд┐рдХ рдЫрд▓рдлрд▓ рд░ рд╣реЛрд▓рд┐рд╡рд╛рд░ рдмрд┐рдирд╛ред рдпреЛ рдмрд╛рд╣рд┐рд░рд┐рдпреЛ рдХрд┐ рд╕рдорд┐рддрд┐рдорд╛ рдЬреАрд╡рд┐рдд рд╡реНрдпрдХреНрддрд┐рд╣рд░реВ рдкрдирд┐ рдЫрдиреН рдЬреЛ рдкреВрд░реНрдг рд░реВрдкрдорд╛ рдирд┐рд╢реНрдЪрд┐рдд рд╣реБрди рд╕рдХреНрджреИрдирдиреН рд╡рд╛ рдХреЗрд╣рд┐ рдерд╛рд╣рд╛ рдирд╣реБрди рд╕рдХреНрдЫред

рд╣реЛрд▓рд┐рднрд░реНрд╕рдХрд╛ рдкреНрд░рд╢рдВрд╕рдХрд╣рд░реВрдХрд╛ рд▓рд╛рдЧрд┐, рддреЗрд╕реНрд░реЛ рдШрдЯрдирд╛ рдХреЗрд╕рдорд╛ рд░рд╣реНрдпреЛ - BOF рд╕рддреНрд░ "рдЧреЛ рдмрдирд╛рдо C++"ред рд╣рд╛рдореА рдПрдХ рдЧреЛ рдкреНрд░реЗрдореА, рдПрдХ C++ рдкреНрд░реЗрдореА рд▓рд┐рдиреНрдЫреМрдВ, рд╕рддреНрд░ рд╕реБрд░реБ рд╣реБрдиреБ рдЕрдШрд┐ рддрд┐рдиреАрд╣рд░реВрд▓реЗ 100500 рд╕реНрд▓рд╛рдЗрдбрд╣рд░реВ рддрдпрд╛рд░ рдкрд╛рд░реНрдЫрдиреН (рдЬрд╕реНрддреИ C++ рдорд╛ рдкреНрдпрд╛рдХреЗрдЬрд╣рд░реВрдорд╛ рд╕рдорд╕реНрдпрд╛ рд╡рд╛ Go рдорд╛ рдЬреЗрдиреЗрд░рд┐рдХрдХреЛ рдЕрднрд╛рд╡), рд░ рддреНрдпрд╕рдкрдЫрд┐ рддрд┐рдиреАрд╣рд░реВрд▓реЗ рдЖрдкрд╕рдорд╛ рдЬреАрд╡рдиреНрдд рдЫрд▓рдлрд▓ рдЧрд░реНрдЫрдиреН рд░ред рджрд░реНрд╢рдХрд╣рд░реВрд╕рдБрдЧ, рд░ рджрд░реНрд╢рдХрд╣рд░реВрд▓реЗ рдПрдХреИрдЪреЛрдЯрд┐ рджреБрдИрд╡рдЯрд╛ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдмреБрдЭреНрди рдкреНрд░рдпрд╛рд╕ рдЧрд░реНрдЫрдиреНред рдпрджрд┐ рд╣реЛрд▓рд┐рднрд░ рд╕рдиреНрджрд░реНрдн рдмрд╛рд╣рд┐рд░ рд╕реБрд░реБ рд╣реБрдиреНрдЫ рднрдиреЗ, рдордзреНрдпрд╕реНрдердХрд░реНрддрд╛рд▓реЗ рд╣рд╕реНрддрдХреНрд╖реЗрдк рдЧрд░реНрджрдЫ рд░ рдкрдХреНрд╖рд╣рд░реВрд▓рд╛рдИ рдорд┐рд▓рд╛рдЙрдБрдЫред рдпреЛ рдврд╛рдБрдЪрд╛ рд▓рдд рдЫ: рд╕реБрд░реБ рднрдПрдХреЛ рдзреЗрд░реИ рдШрдгреНрдЯрд╛ рдкрдЫрд┐, рд╕реНрд▓рд╛рдЗрдбрдХреЛ рдЖрдзрд╛ рдорд╛рддреНрд░ рдкреВрд░рд╛ рднрдпреЛред рдЕрдиреНрдд рдзреЗрд░реИ рдЫрд┐рдЯреЛ рд╣реБрдиреБрдкрд░реНрдпреЛред

  • рд╕рд╛рдЭреЗрджрд╛рд░ рдЦрдбрд╛ рдЫ

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

рдкреНрд░рддрд┐рд╡реЗрджрдирдХреЛ рдкреНрд░рд╛рд╡рд┐рдзрд┐рдХ рд╡рд┐рд╡рд░рдг

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

рдХрдореНрдкрд╛рдЗрд▓рд░ рдЕрдкреНрдЯрд┐рдорд╛рдЗрдЬреЗрд╕рдирдХреЛ рдкреНрд░рд┐рдЬреНрдо рдорд╛рд░реНрдлрдд C++ рдорд╛ рдЕрдкрд╡рд╛рджрд╣рд░реВ, рд░реЛрдорди рд░реБрд╕реНрдпрд╛рдПрдн

C++ рд░реВрд╕: рдпреЛ рдХрд╕рд░реА рднрдпреЛ
рдмрд╛рдЯ рд╕реНрд▓рд╛рдЗрдб рдЧрд░реНрдиреБрд╣реЛрд╕реН рдкреНрд░рд╕реНрддреБрддрд┐рдХрд░рдг

рд╢реАрд░реНрд╖рдХрд▓реЗ рд╕реБрдЭрд╛рд╡ рджрд┐рдПрдЭреИрдВ, рд░реЛрдордирд▓реЗ рдЙрджрд╛рд╣рд░рдгрдХреЛ рд░реВрдкрдорд╛ LLVM рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рдЕрдкрд╡рд╛рджрд╣рд░реВрд╕рдБрдЧ рдХрд╛рдо рдЧрд░реНрдиреЗ рдХреБрд░рд╛рд▓рд╛рдИ рд╣реЗрд░реЗред рдПрдХреИ рд╕рдордпрдорд╛, рдЖрдлреНрдиреЛ рдХрд╛рдордорд╛ рдХреНрд▓реНрдпрд╛рдЩреНрдЧ рдкреНрд░рдпреЛрдЧ рдирдЧрд░реНрдиреЗрд╣рд░реВрдХрд╛ рд▓рд╛рдЧрд┐, рд░рд┐рдкреЛрд░реНрдЯрд▓реЗ рдХреЛрдбрд▓рд╛рдИ рдХрд╕рд░реА рд╕рдореНрднрд╛рд╡рд┐рдд рд░реВрдкрдорд╛ рдЕрдиреБрдХреВрд▓рд┐рдд рдЧрд░реНрди рд╕рдХрд┐рдиреНрдЫ рднрдиреНрдиреЗ рдмрд╛рд░реЗ рдХреЗрд╣реА рд╡рд┐рдЪрд╛рд░ рджрд┐рди рд╕рдХреНрдЫред рдпреЛ рдпрд╕рдХрд╛рд░рдг рд╣реЛ рдХрд┐рдирднрдиреЗ рдХрдореНрдкрд╛рдЗрд▓рд░рд╣рд░реВ рд░ рд╕рдореНрдмрдиреНрдзрд┐рдд рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдпрд╣рд░реВрдХреЛ рд╡рд┐рдХрд╛рд╕рдХрд░реНрддрд╛рд╣рд░реВ рдПрдХрдЕрд░реНрдХрд╛рд╕рдБрдЧ рдХреБрд░рд╛рдХрд╛рдиреА рдЧрд░реНрдЫрдиреН рд░ рдзреЗрд░реИ рд╕рдлрд▓ рд╕рдорд╛рдзрд╛рдирд╣рд░реВ рдорд┐рд▓реНрди рд╕рдХреНрдЫрдиреНред

рддреНрдпрд╕реЛрднрдП, рдЕрдкрд╡рд╛рдж рд╣реНрдпрд╛рдиреНрдбрд▓ рдЧрд░реНрди, рддрдкрд╛рдИрдВрд▓реЗ рдзреЗрд░реИ рдЪреАрдЬрд╣рд░реВ рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫ: рд╣реНрдпрд╛рдиреНрдбрд▓рд┐рдВрдЧ рдХреЛрдб (рдпрджрд┐ рдХреБрдиреИ рд╣реЛ рднрдиреЗ) рд╡рд╛ рд╣рд╛рд▓рдХреЛ рд╕реНрддрд░рдорд╛ рдирд┐: рд╢реБрд▓реНрдХ рд╕реНрд░реЛрддрд╣рд░реВ рдХрд▓ рдЧрд░реНрдиреБрд╣реЛрд╕реН рд░ рд╕реНрдЯреНрдпрд╛рдХрд▓рд╛рдИ рдЙрдЪреНрдЪ рд╕реНрдкрд┐рди рдЧрд░реНрдиреБрд╣реЛрд╕реНред рдпреЛ рд╕рдмреИрд▓реЗ рдпрд╕ рддрдереНрдпрд▓рд╛рдИ рдирд┐рдореНрддреНрдпрд╛рдЙрдБрдЫ рдХрд┐ рдХрдореНрдкрд╛рдЗрд▓рд░рд▓реЗ рдХрд▓рд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ рдердк рдирд┐рд░реНрджреЗрд╢рдирд╣рд░реВ рдердкреНрдЫ рдЬреБрди рд╕рдореНрднрд╛рд╡рд┐рдд рд░реВрдкрдорд╛ рдЕрдкрд╡рд╛рджрд╣рд░реВ рдлрд╛рд▓реНрдЫред рддреНрдпрд╕рдХрд╛рд░рдг, рдпрджрд┐ рдЕрдкрд╡рд╛рдж рд╡рд╛рд╕реНрддрд╡рдорд╛ рдЙрдард╛рдЗрдПрдХреЛ рдЫреИрди рднрдиреЗ, рдХрд╛рд░реНрдпрдХреНрд░рдорд▓реЗ рдЕрдЭреИ рдкрдирд┐ рдЕрдирд╛рд╡рд╢реНрдпрдХ рдХрд╛рд░реНрдпрд╣рд░реВ рдЧрд░реНрдиреЗрдЫред рдХреБрдиреИ рди рдХреБрдиреИ рд░реВрдкрдорд╛ рдУрднрд░рд╣реЗрдб рдШрдЯрд╛рдЙрдирдХреЛ рд▓рд╛рдЧрд┐, LLVM рд╕рдБрдЧ рдЕрдкрд╡рд╛рдж рд╣реНрдпрд╛рдиреНрдбрд▓рд┐рдВрдЧ рдХреЛрдб рдердкреНрди рдЖрд╡рд╢реНрдпрдХ рдкрд░реНрджреИрди рд╡рд╛ "рдЕрддрд┐рд░рд┐рдХреНрдд" рдирд┐рд░реНрджреЗрд╢рдирд╣рд░реВрдХреЛ рд╕рдВрдЦреНрдпрд╛ рдШрдЯрд╛рдЙрди рд╕рдХрд┐рдиреЗ рдЕрд╡рд╕реНрдерд╛рд╣рд░реВ рдирд┐рд░реНрдзрд╛рд░рдг рдЧрд░реНрдирдХрд╛ рд▓рд╛рдЧрд┐ рдзреЗрд░реИ рд╣реЗрд░рд┐рд╕реНрдЯрд┐рдХреНрд╕рд╣рд░реВ рдЫрдиреНред

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

рддрд╕рд░реНрде, рд░реЛрдорди рд░реБрд╕реНрдпрд╛рдПрднрд▓реЗ рд╡рд┐рджреНрдпрд╛рд░реНрдереАрд╣рд░реВрд▓рд╛рдИ рдЕрдкрд╡рд╛рдж рд╣реНрдпрд╛рдиреНрдбрд▓рд┐рдЩ рднрдПрдХреЛ рдХреЛрдб рд╕рдзреИрдВ рд╢реВрдиреНрдп рдУрднрд░рд╣реЗрдбрд╕рдБрдЧ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЧрд░реНрди рд╕рдХрд┐рдБрджреИрди рднрдиреНрдиреЗ рдирд┐рд╖реНрдХрд░реНрд╖рдорд╛ рдкреБрдЧреНрдЫрдиреН рд░ рдирд┐рдореНрди рд╕рд▓реНрд▓рд╛рд╣ рджрд┐рдиреНрдЫрдиреН:

  • рдкреБрд╕реНрддрдХрд╛рд▓рдпрд╣рд░реВ рд╡рд┐рдХрд╛рд╕ рдЧрд░реНрджрд╛, рдпреЛ рд╕рд┐рджреНрдзрд╛рдиреНрддрдорд╛ рдЕрдкрд╡рд╛рджрд╣рд░реВ рддреНрдпрд╛рдЧреНрди рд▓рд╛рдпрдХ рдЫ;
  • рдпрджрд┐ рдЕрдкрд╡рд╛рджрд╣рд░реВ рдЕрдЭреИ рдЖрд╡рд╢реНрдпрдХ рдЫ рднрдиреЗ, рдЬрдм рд╕рдореНрднрд╡ рднрдПрд╕рдореНрдо рдпреЛ рд╕рдмреИ рдард╛рдЙрдБрдорд╛ noexcept (рд░ const) рдкрд░рд┐рдорд╛рд░реНрдЬрдирд╣рд░реВ рдердкреНрди рд▓рд╛рдпрдХ рдЫ рддрд╛рдХрд┐ рдХрдореНрдкрд╛рдЗрд▓рд░рд▓реЗ рд╕рдХреЗрд╕рдореНрдо рдЕрдиреБрдХреВрд▓рди рдЧрд░реНрди рд╕рдХреНрдЫред

рд╕рд╛рдорд╛рдиреНрдпрддрдпрд╛, рд╡рдХреНрддрд╛рд▓реЗ рдпреЛ рджреГрд╢реНрдп рдкреБрд╖реНрдЯрд┐ рдЧрд░реЗ рдХрд┐ рдЕрдкрд╡рд╛рджрд╣рд░реВ рдиреНрдпреВрдирддрдордорд╛ рдкреНрд░рдпреЛрдЧ рдЧрд░рд┐рдиреНрдЫ рд╡рд╛ рдкреВрд░реНрдг рд░реВрдкрдорд╛ рдкрд░рд┐рддреНрдпрд╛рдЧ рдЧрд░рд┐рдиреНрдЫред

рд░рд┐рдкреЛрд░реНрдЯ рд╕реНрд▓рд╛рдЗрдбрд╣рд░реВ рдирд┐рдореНрди рд▓рд┐рдЩреНрдХрдорд╛ рдЙрдкрд▓рдмреНрдз рдЫрдиреН: ["LLVM рдХрдореНрдкрд╛рдЗрд▓рд░ рдЕрдкреНрдЯрд┐рдорд╛рдЗрдЬреЗрд╕рдирдХреЛ рд▓реЗрдиреНрд╕ рдорд╛рд░реНрдлрдд C++ рдЕрдкрд╡рд╛рджрд╣рд░реВ"]

рдЬреЗрдирд░реЗрдЯрд░рд╣рд░реВ, рдХреЛрд░реБрдЯрд┐рдирд╣рд░реВ рд░ рдЕрдиреНрдп рдорд╕реНрддрд┐рд╖реНрдХ-рдЕрдирд░реЛрд▓рд┐рдЩ рдорд┐рдард╛рд╕, рдЖрджрд┐ рд╢рд╡рд┐рдд

C++ рд░реВрд╕: рдпреЛ рдХрд╕рд░реА рднрдпреЛ
рдмрд╛рдЯ рд╕реНрд▓рд╛рдЗрдб рдЧрд░реНрдиреБрд╣реЛрд╕реН рдкреНрд░рд╕реНрддреБрддрд┐рдХрд░рдг

C++20 рдорд╛ рдЖрд╡рд┐рд╖реНрдХрд╛рд░рд╣рд░реВрдХрд╛ рд▓рд╛рдЧрд┐ рд╕рдорд░реНрдкрд┐рдд рдпрд╕ рд╕рдореНрдореЗрд▓рдирдорд╛ рдзреЗрд░реИ рд░рд┐рдкреЛрд░реНрдЯрд╣рд░реВ рдордзреНрдпреЗ рдПрдЙрдЯрд╛ рдпрд╕рдХреЛ рд░рдВрдЧреАрди рдкреНрд░рд╕реНрддреБрддрд┐рдХреЛ рд▓рд╛рдЧрд┐ рдорд╛рддреНрд░ рд╣реЛрдЗрди, рддрд░ рд╕рдЩреНрдХрд▓рди рдкреНрд░рдХреНрд░рд┐рдпрд╛ рддрд░реНрдХ (рд▓реВрдк, рдХрд▓рдмреНрдпрд╛рдХрд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐) рд╕рдБрдЧ рд╡рд┐рджреНрдпрдорд╛рди рд╕рдорд╕реНрдпрд╛рд╣рд░реВрдХреЛ рд╕реНрдкрд╖реНрдЯ рдкрд╣рд┐рдЪрд╛рдирдХреЛ рд▓рд╛рдЧрд┐ рдкрдирд┐ рдпрд╛рджрдЧрд╛рд░ рдерд┐рдпреЛред

Adi Shavit рд▓реЗ рдирд┐рдореНрдирд▓рд╛рдИ рд╣рд╛рдЗрд▓рд╛рдЗрдЯ рдЧрд░реНрджрдЫ: рд╣рд╛рд▓ рдЙрдкрд▓рдмреНрдз рд╡рд┐рдзрд┐рд╣рд░реВрд▓реЗ рд╕рдореНрдкреВрд░реНрдг рд╕рдЩреНрдХрд▓рдирдорд╛ рдЬрд╛рдиреНрдЫрдиреН рд░ рдХреЗрд╣реА рдЖрдиреНрддрд░рд┐рдХ рдордзреНрдпрд╡рд░реНрддреА рдЕрд╡рд╕реНрдерд╛рд╣рд░реВрдорд╛ рдкрд╣реБрдБрдЪ рдкреНрд░рджрд╛рди рдЧрд░реНрджреИрдирдиреН (рд╡рд╛ рддрд┐рдиреАрд╣рд░реВ рдХрд▓рдмреНрдпрд╛рдХрдХреЛ рдорд╛рдорд▓рд╛рдорд╛ рдЧрд░реНрдЫрдиреН, рддрд░ рдареВрд▓реЛ рд╕рдВрдЦреНрдпрд╛рдорд╛ рдЕрдкреНрд░рд┐рдп рд╕рд╛рдЗрдб рдЗрдлреЗрдХреНрдЯрд╣рд░реВ, рдЬрд╕реНрддреИ рдХрд▓рдмреНрдпрд╛рдХ рдирд░рдХ)ред ред рдпрд╕реНрддреЛ рджреЗрдЦрд┐рдиреНрдЫ рдХрд┐ рддреНрдпрд╣рд╛рдБ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рд╣рд░реВ рдЫрдиреН, рддрд░ рддрд┐рдиреАрд╣рд░реВрд╕рдБрдЧ рдкрдирд┐ рд╕рдмреИ рдХреБрд░рд╛ рддреНрдпрддрд┐ рд╕рд╣рдЬ рдЫреИрди: рддреНрдпрд╣рд╛рдБ рдХреБрдиреИ рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рд╡реЗрд╢ рд░ рдмрд╛рд╣рд┐рд░ рдирд┐рд╕реНрдХрдиреЗ рдмрд┐рдиреНрджреБрд╣рд░реВ рдЫреИрдирдиреН (рд╕реБрд░реБ тЖТ рдЕрдиреНрддреНрдп рдмрдирд╛рдо rbegin тЖТ рд░реЗрдиреНрдб рд░ рдпрд╕реНрддреИ), рдпреЛ рд╕реНрдкрд╖реНрдЯ рдЫреИрди рдХрд┐ рд╣рд╛рдореА рдХрд╣рд┐рд▓реЗрд╕рдореНрдо рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдЧрд░реНрдиреЗрдЫреМрдВ? C++ 20 рдмрд╛рдЯ рд╕реБрд░реБ рдЧрд░реНрджреИ, рдпреА рд╕рдорд╕реНрдпрд╛рд╣рд░реВ рд╣рд▓ рд╣реБрдиреНрдЫрдиреН!

рдкрд╣рд┐рд▓реЛ рд╡рд┐рдХрд▓реНрдк: рджрд╛рдпрд░рд╛ред рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рд╣рд░реВ рд░реНтАНрдпрд╛рдк рдЧрд░реЗрд░, рд╣рд╛рдореАрд▓реЗ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдХреЛ рд╕реБрд░реБ рд░ рдЕрдиреНрддреНрдпрдХреЛ рд▓рд╛рдЧрд┐ рд╕рд╛рдЭрд╛ рдЗрдиреНрдЯрд░рдлреЗрд╕ рдкрд╛рдЙрдБрдЫреМрдВ, рд░ рд╣рд╛рдореАрд▓реЗ рд░рдЪрдирд╛ рдЧрд░реНрдиреЗ рдХреНрд╖рдорддрд╛ рдкрдирд┐ рдкрд╛рдЙрдБрдЫреМрдВред рдпреА рд╕рдмреИрд▓реЗ рдкреВрд░реНрдг рдбрд╛рдЯрд╛ рдкреНрд░реЛрд╕реЗрд╕рд┐рдЩ рдкрд╛рдЗрдкрд▓рд╛рдЗрдирд╣рд░реВ рдирд┐рд░реНрдорд╛рдг рдЧрд░реНрди рд╕рдЬрд┐рд▓реЛ рдмрдирд╛рдЙрдБрдЫред рддрд░ рд╕рдмреИ рдХреБрд░рд╛ рдпрддрд┐ рд╕рд╣рдЬ рдЫреИрди: рдЧрдгрдирд╛ рддрд░реНрдХ рдХреЛ рдПрдХ рднрд╛рдЧ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХреЛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рднрд┐рддреНрд░ рд╕реНрдерд┐рдд рдЫ, рдЬрд╕рд▓реЗ рдХреЛрдб рдмреБрдЭреНрди рд░ рдбрд┐рдмрдЧ рдЧрд░реНрди рдЬрдЯрд┐рд▓ рдмрдирд╛рдЙрди рд╕рдХреНрдЫред

C++ рд░реВрд╕: рдпреЛ рдХрд╕рд░реА рднрдпреЛ
рдмрд╛рдЯ рд╕реНрд▓рд╛рдЗрдб рдЧрд░реНрдиреБрд╣реЛрд╕реН рдкреНрд░рд╕реНрддреБрддрд┐рдХрд░рдг

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

рддрд░ рдорд▓рдордорд╛ рдлреНрд▓рд╛рдИ рдЫ: рдпрд╕ рд╕рдордпрдорд╛ рддрд┐рдиреАрд╣рд░реВ рдЕрд╡рд╕реНрдерд┐рдд рдХрдореНрдкрд╛рдЗрд▓рд░рд╣рд░реВ рджреНрд╡рд╛рд░рд╛ рдЖрдВрд╢рд┐рдХ рд░реВрдкрдорд╛ рд╕рдорд░реНрдерд┐рдд рдЫрдиреН, рд░ рд╣рд╛рдореАрд▓реЗ рдЪрд╛рд╣реЗрдЬрд╕реНрддреЛ рд╕рдлрд╛ рд░реВрдкрдорд╛ рд▓рд╛рдЧреВ рдЧрд░рд┐рдПрдХреЛ рдЫреИрди: рдЙрджрд╛рд╣рд░рдгрдХрд╛ рд▓рд╛рдЧрд┐, рдпреЛ рдЕрдЭреИ рдкрдирд┐ рдХреЛрд░реЛрдЯрд┐рдирд╣рд░реВрдорд╛ рд╕рдиреНрджрд░реНрднрд╣рд░реВ рд░ рдЕрд╕реНрдерд╛рдпреА рд╡рд╕реНрддреБрд╣рд░реВ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрди рд▓рд╛рдпрдХ рдЫреИрдиред рд╕рд╛рдереИ, рддреНрдпрд╣рд╛рдБ coroutines рд╣реБрди рд╕рдХреНрдЫ рдХреЗрд╣реА рдкреНрд░рддрд┐рдмрдиреНрдзрд╣рд░реВ рдЫрдиреН, рд░ constexpr рдкреНрд░рдХрд╛рд░реНрдпрд╣рд░реВ, рдирд┐рд░реНрдорд╛рдгрдХрд░реНрддрд╛/рд╡рд┐рдирд╛рд╢рдХрд╛рд░реАрд╣рд░реВ, рд░ рдореБрдЦреНрдп рдпрд╕ рд╕реВрдЪреАрдорд╛ рд╕рдорд╛рд╡реЗрд╢ рдЫреИрдирдиреНред

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

рд╕рд╛рдордЧреНрд░реАрд╣рд░реВ:

Yandex.Taxi, Anton Polukhin рдмрд╛рдЯ C++ рдЪрд╛рд▓рд╣рд░реВ

рдореЗрд░реЛ рд╡реНрдпрд╛рд╡рд╕рд╛рдпрд┐рдХ рдЧрддрд┐рд╡рд┐рдзрд┐рд╣рд░реВрдорд╛, рдХрд╣рд┐рд▓реЗрдХрд╛рд╣реАрдБ рдореИрд▓реЗ рд╡рд┐рд╢реБрджреНрдз рд░реВрдкрдорд╛ рд╕рд╣рд╛рдпрдХ рдЪреАрдЬрд╣рд░реВ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЧрд░реНрдиреБрдкрд░реНрдЫ: рдЖрдиреНрддрд░рд┐рдХ рдЗрдиреНрдЯрд░рдлреЗрд╕ рд░ рдХреЗрд╣реА рдкреБрд╕реНрддрдХрд╛рд▓рдпрдХреЛ API рдмреАрдЪрдХреЛ рд░реНрдпрд╛рдкрд░, рд▓рдЧрд┐рдЩ рд╡рд╛ рдкрд╛рд░реНрд╕рд┐рдЩред рдпрд╕ рдЕрд╡рд╕реНрдерд╛рдорд╛, рддреНрдпрд╣рд╛рдБ рд╕рд╛рдорд╛рдиреНрдпрддрдпрд╛ рдХреБрдиреИ рдЕрддрд┐рд░рд┐рдХреНрдд рдЕрдиреБрдХреВрд▓рди рдХреЛ рд▓рд╛рдЧреА рдХреБрдиреИ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдЫреИрдиред рддрд░ рдХреЗ рд╣реБрдиреНрдЫ рдпрджрд┐ рдпреА рдШрдЯрдХрд╣рд░реВ RuNet рдорд╛ рдХреЗрд╣рд┐ рд╕рдмреИрднрдиреНрджрд╛ рд▓реЛрдХрдкреНрд░рд┐рдп рд╕реЗрд╡рд╛рд╣рд░реВрдорд╛ рдкреНрд░рдпреЛрдЧ рдЧрд░рд┐рдиреНрдЫ? рдпрд╕реНрддреЛ рдЕрд╡рд╕реНрдерд╛рдорд╛, рддрдкрд╛рдИрд▓реЗ рдЯреЗрд░рд╛рдмрд╛рдЗрдЯ рдкреНрд░рддрд┐ рдШрдгреНрдЯрд╛ рд▓рдЧрд╣рд░реВ рдПрдХреНрд▓реИ рдкреНрд░рд╢реЛрдзрди рдЧрд░реНрдиреБрдкрд░реНрдиреЗрдЫ! рддреНрдпрд╕рдкрдЫрд┐ рдкреНрд░рддреНрдпреЗрдХ рдорд┐рд▓рд┐рд╕реЗрдХреЗрдиреНрдб рдЧрдгрдирд╛ рд╣реБрдиреНрдЫ рд░ рддреНрдпрд╕реИрд▓реЗ рддрдкрд╛рдИрдВрд▓реЗ рд╡рд┐рднрд┐рдиреНрди рдЪрд╛рд▓рд╣рд░реВ рд░рд┐рд╕реЛрд░реНрдЯ рдЧрд░реНрдиреБрдкрд░реНрдЫ - рдПрдиреНрдЯреЛрди рдкреЛрд▓реБрдЦрд┐рди рддрд┐рдиреАрд╣рд░реВрдХреЛ рдмрд╛рд░реЗрдорд╛ рдХреБрд░рд╛ рдЧрд░реЗред

рд╕рд╛рдпрдж рд╕рдмреИрднрдиреНрджрд╛ рд░реЛрдЪрдХ рдЙрджрд╛рд╣рд░рдг рд╕реВрдЪрдХ-рджреЗрдЦрд┐-рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди (рдкрд┐рдореНрдкрд▓) рдврд╛рдБрдЪрд╛рдХреЛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдерд┐рдпреЛред 

#include <third_party/json.hpp> //PROBLEMS! 
struct Value { 
    Value() = default; 
    Value(Value&& other) = default; 
    Value& operator=(Value&& other) = default; 
    ~Value() = default; 

    std::size_t Size() const { return data_.size(); } 

private: 
    third_party::Json data_; 
};

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

рдареАрдХ рдЫ, рд╣рд╛рдореАрд▓реЗ #include .cpp рдлрд╛рдЗрд▓рдорд╛ рд╕рд╛рд░реНрдпреМрдВ: рд╣рд╛рдореАрд▓рд╛рдИ рд░реНтАНрдпрд╛рдк рдЧрд░рд┐рдПрдХреЛ рдПрдкреАрдЖрдИ, рд╕рд╛рдереИ std::unique_ptr рдХреЛ рдЕрдЧрд╛рдбрд┐ рдШреЛрд╖рдгрд╛ рдЪрд╛рд╣рд┐рдиреНрдЫред рдЕрдм рд╣рд╛рдореАрд╕рдБрдЧ рдЧрддрд┐рд╢реАрд▓ рдЖрд╡рдВрдЯрди рд░ рдЕрдиреНрдп рдЕрдкреНрд░рд┐рдп рдЪреАрдЬрд╣рд░реВ рдЫрдиреН рдЬрд╕реНрддреИ рдбрд╛рдЯрд╛рдХреЛ рдЧреБрдЪреНрдЫрд╛рдорд╛ рдЫрд░рд┐рдПрдХрд╛ рдбрд╛рдЯрд╛ рд░ рдХрдо рдЧреНрдпрд╛рд░реЗрдиреНрдЯреАрд╣рд░реВред std::aligned_storage рд▓реЗ рдпреЛ рд╕рдмреИрдорд╛ рдорджреНрджрдд рдЧрд░реНрди рд╕рдХреНрдЫред 

struct Value { 
// ... 
private: 
    using JsonNative = third_party::Json; 
    const JsonNative* Ptr() const noexcept; 
    JsonNative* Ptr() noexcept; 

    constexpr std::size_t kImplSize = 32; 
    constexpr std::size_t kImplAlign = 8; 
    std::aligned_storage_t<kImplSize, kImplAlign> data_; 
};

рдорд╛рддреНрд░ рд╕рдорд╕реНрдпрд╛: рд╣рд╛рдореАрд▓реЗ рдкреНрд░рддреНрдпреЗрдХ рд░реНрдпрд╛рдкрд░рдХреЛ рд▓рд╛рдЧрд┐ рд╕рд╛рдЗрдЬ рд░ рдкрдЩреНрдХреНрддрд┐рдмрджреНрдзрддрд╛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫ - рдкреНрдпрд╛рд░рд╛рдорд┐рдЯрд░рд╣рд░реВ рд╕рдБрдЧ рд╣рд╛рдореНрд░реЛ рдкрд┐рдореНрдкрд▓ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдмрдирд╛рдЙрдиреБрд╣реЛрд╕реН, рдХреЗрд╣реА рдордирдорд╛рдиреА рдорд╛рдирд╣рд░реВ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреБрд╣реЛрд╕реН рд░ рд╡рд┐рдирд╛рд╢рдХрд░реНрддрд╛рдорд╛ рдЪреЗрдХ рдердкреНрдиреБрд╣реЛрд╕реН рдЬреБрди рд╣рд╛рдореАрд▓реЗ рд╕рдмреИ рдХреБрд░рд╛ рд╕рд╣реА рдЕрдиреБрдорд╛рди рдЧрд░реЗрдХрд╛ рдЫреМрдВред : 

~FastPimpl() noexcept { 
    validate<sizeof(T), alignof(T)>(); 
    Ptr()->~T(); 
}

template <std::size_t ActualSize, std::size_t ActualAlignment>
static void validate() noexcept { 
    static_assert(
        Size == ActualSize, 
        "Size and sizeof(T) mismatch"
    ); 
    static_assert(
        Alignment == ActualAlignment, 
        "Alignment and alignof(T) mismatch"
    ); 
}

T рд▓рд╛рдИ рдкрд╣рд┐рд▓реЗ рдиреИ рдбрд┐рд╕реНрдЯреНрд░рдХреНрдЯрд░ рдкреНрд░рд╢реЛрдзрди рдЧрд░реНрджрд╛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдЧрд░рд┐рдПрдХреЛ рд╣реБрдирд╛рд▓реЗ, рдпреЛ рдХреЛрдбрд▓рд╛рдИ рд╕рд╣реА рд░реВрдкрдорд╛ рдкрд╛рд░реНрд╕ рдЧрд░рд┐рдиреЗрдЫ рд░ рд╕рдВрдХрд▓рди рдЪрд░рдгрдорд╛ рдпрд╕рд▓реЗ рдЖрд╡рд╢реНрдпрдХ рдЖрдХрд╛рд░ рд░ рдкрдЩреНрдХреНрддрд┐рдмрджреНрдз рдорд╛рдирд╣рд░реВ рдЖрдЙрдЯрдкреБрдЯ рдЧрд░реНрдиреЗрдЫ рдЬреБрди рддреНрд░реБрдЯрд┐рд╣рд░реВрдХреЛ рд░реВрдкрдорд╛ рдкреНрд░рд╡рд┐рд╖реНрдЯ рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫред рдпрд╕рд░реА, рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рд╕рдВрдХрд▓рди рд░рдирдХреЛ рд▓рд╛рдЧрддрдорд╛, рд╣рд╛рдореА рд░реНтАНрдпрд╛рдк рдЧрд░рд┐рдПрдХреЛ рдХрдХреНрд╖рд╛рд╣рд░реВрдХреЛ рдЧрддрд┐рд╢реАрд▓ рдЖрд╡рдВрдЯрдирдмрд╛рдЯ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛рдЙрдБрдЫреМрдВ, рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдирдХреЛ рд╕рд╛рде .cpp рдлрд╛рдЗрд▓рдорд╛ API рд▓реБрдХрд╛рдЙрдБрдЫреМрдВ, рд░ рдкреНрд░реЛрд╕реЗрд╕рд░рджреНрд╡рд╛рд░рд╛ рдХреНрдпрд╛рд╕рд┐рдЩрдХрд╛ рд▓рд╛рдЧрд┐ рдЙрдкрдпреБрдХреНрдд рдбрд┐рдЬрд╛рдЗрди рдкрдирд┐ рдкрд╛рдЙрдБрдЫреМрдВред

рд▓рдЧрд┐рдЩ рд░ рдкрд╛рд░реНрд╕рд┐рдЩ рдХрдо рдкреНрд░рднрд╛рд╡рд╢рд╛рд▓реА рджреЗрдЦрд┐рдиреНрдереНрдпреЛ рд░ рддреНрдпрд╕реИрд▓реЗ рдпреЛ рд╕рдореАрдХреНрд╖рд╛рдорд╛ рдЙрд▓реНрд▓реЗрдЦ рдЧрд░рд┐рдиреЗ рдЫреИрдиред

рд░рд┐рдкреЛрд░реНрдЯ рд╕реНрд▓рд╛рдЗрдбрд╣рд░реВ рдирд┐рдореНрди рд▓рд┐рдЩреНрдХрдорд╛ рдЙрдкрд▓рдмреНрдз рдЫрдиреН: ["рдЯреНрдпрд╛рдХреНрд╕реАрдмрд╛рдЯ C++ рдЪрд╛рд▓рд╣рд░реВ"]

рддрдкрд╛рдИрдВрдХреЛ рдХреЛрдб DRY, Bj├╢rn Fahller рд░рд╛рдЦреНрдирдХреЛ рд▓рд╛рдЧрд┐ рдЖрдзреБрдирд┐рдХ рдкреНрд░рд╡рд┐рдзрд┐рд╣рд░реВ

рдпрд╕ рд╡рд╛рд░реНрддрд╛рдорд╛, Bj├╢rn Fahller рдмрд╛рд░рдореНрдмрд╛рд░ рдЕрд╡рд╕реНрдерд╛ рдЬрд╛рдБрдЪрдХреЛ рд╢реИрд▓реАрдЧрдд рддреНрд░реБрдЯрд┐ рд╡рд┐рд░реБрджреНрдз рд▓рдбреНрди рд╡рд┐рднрд┐рдиреНрди рддрд░рд┐рдХрд╛рд╣рд░реВ рджреЗрдЦрд╛рдЙрдБрдЫрдиреН:

assert(a == IDLE || a == CONNECTED || a == DISCONNECTED);

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

assert(a == any_of(IDLE, CONNECTED, DISCONNECTED));

рдЪреЗрдХрд╣рд░реВрдХреЛ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╕рдВрдЦреНрдпрд╛ рд╣реНрдпрд╛рдиреНрдбрд▓ рдЧрд░реНрди, рддрдкрд╛рдИрдВрд▓реЗ рддреБрд░реБрдиреНрддреИ рд╡рд┐рднрд┐рдиреНрди рдЯреЗрдореНрдкреНрд▓реЗрдЯрд╣рд░реВ рд░ рдлреЛрд▓реНрдб рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рд╣рд░реВ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫред рдорд╛рдиреМрдВ рдХрд┐ рд╣рд╛рдореА enum рдХреЛ state_type рддрддреНрд╡рдорд╛ рдзреЗрд░реИ рдЪрд░рд╣рд░реВрдХреЛ рд╕рдорд╛рдирддрд╛ рдЬрд╛рдБрдЪ рдЧрд░реНрди рдЪрд╛рд╣рдиреНрдЫреМрдВред рджрд┐рдорд╛рдЧрдорд╛ рдЖрдЙрдиреЗ рдкрд╣рд┐рд▓реЛ рдХреБрд░рд╛ рднрдиреЗрдХреЛ рд╕рд╣рд╛рдпрдХ рдкреНрд░рдХрд╛рд░реНрдп рд▓реЗрдЦреНрдиреБ рд╣реЛ is_any_of:


enum state_type { IDLE, CONNECTED, DISCONNECTED };

template <typename ... Ts>
bool is_any_of(state_type s, const Ts& ... ts) { 
    return ((s == ts) || ...); 
}

рдпреЛ рдордзреНрдпрд╡рд░реНрддреА рдирддрд┐рдЬрд╛ рдирд┐рд░рд╛рд╢рд╛рдЬрдирдХ рдЫред рдЕрд╣рд┐рд▓реЗрд╕рдореНрдо рдХреЛрдб рдердк рдкрдвреНрди рдпреЛрдЧреНрдп рднрдЗрд░рд╣реЗрдХреЛ рдЫреИрди:

assert(is_any_of(state, IDLE, DISCONNECTING, DISCONNECTED)); 

рдЧреИрд░-рдкреНрд░рдХрд╛рд░ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдкреНрдпрд╛рд░рд╛рдорд┐рдЯрд░рд╣рд░реВрд▓реЗ рд╕реНрдерд┐рддрд┐рд▓рд╛рдИ рдереЛрд░реИ рд╕реБрдзрд╛рд░ рдЧрд░реНрди рдорджреНрджрдд рдЧрд░реНрдиреЗрдЫред рддрд┐рдиреАрд╣рд░реВрдХреЛ рдорджреНрджрддрд▓реЗ, рд╣рд╛рдореА рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдкреНрдпрд╛рд░рд╛рдорд┐рдЯрд░рд╣рд░реВрдХреЛ рд╕реВрдЪреАрдорд╛ enum рдХреЛ рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рддрддреНрд╡рд╣рд░реВ рд╕реНрдерд╛рдирд╛рдиреНрддрд░рдг рдЧрд░реНрдиреЗрдЫреМрдВ: 

template <state_type ... states>
bool is_any_of(state_type t) { 
    return ((t == states) | ...); 
}
	
assert(is_any_of<IDLE, DISCONNECTING, DISCONNECTED>(state)); 

рдЧреИрд░-рдкреНрд░рдХрд╛рд░ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдкреНрдпрд╛рд░рд╛рдорд┐рдЯрд░ (C++17) рдорд╛ рд╕реНрд╡рдд: рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░, рджреГрд╖реНрдЯрд┐рдХреЛрдгрд▓реЗ рдХреЗрд╡рд▓ state_type рддрддреНрд╡рд╣рд░реВрд╕рдБрдЧ рдорд╛рддреНрд░ рд╣реЛрдЗрди, рддрд░ рдЧреИрд░-рдкреНрд░рдХрд╛рд░ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдкреНрдпрд╛рд░рд╛рдорд┐рдЯрд░рд╣рд░реВрдХреЛ рд░реВрдкрдорд╛ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрди рд╕рдХрд┐рдиреЗ рдЖрджрд┐рдо рдкреНрд░рдХрд╛рд░рд╣рд░реВрд╕рдБрдЧ рдкрдирд┐ рддреБрд▓рдирд╛ рдЧрд░реНрди рд╕рд╛рдорд╛рдиреНрдп рдмрдирд╛рдЙрдБрдЫ:


template <auto ... alternatives, typename T>
bool is_any_of(const T& t) {
    return ((t == alternatives) | ...);
}

рдпреА рдХреНрд░рдорд┐рдХ рд╕реБрдзрд╛рд░рд╣рд░реВ рдорд╛рд░реНрдлрдд, рдЬрд╛рдБрдЪрд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ рд╡рд╛рдВрдЫрд┐рдд рдзрд╛рд░рд╛рдкреНрд░рд╡рд╛рд╣ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдкреНрд░рд╛рдкреНрдд рд╣реБрдиреНрдЫ:


template <class ... Ts>
struct any_of : private std::tuple<Ts ...> { 
// ╨┐╨╛╨╗╨╡╨╜╨╕╨╝╤Б╤П ╨╕ ╤Г╨╜╨░╤Б╨╗╨╡╨┤╤Г╨╡╨╝ ╨║╨╛╨╜╤Б╤В╤А╤Г╨║╤В╨╛╤А╤Л ╨╛╤В tuple 
        using std::tuple<Ts ...>::tuple;
        template <typename T>
        bool operator ==(const T& t) const {
                return std::apply(
                        [&t](const auto& ... ts) {
                                return ((ts == t) || ...);
                        },
                        static_cast<const std::tuple<Ts ...>&>(*this));
        }
};

template <class ... Ts>
any_of(Ts ...) -> any_of<Ts ... >;
 
assert(any_of(IDLE, DISCONNECTING, DISCONNECTED) == state);

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

рдердк - рдердк рд░реЛрдЪрдХред рдмреНрдпреЛрд░реНрдирд▓реЗ рддреБрд▓рдирд╛рддреНрдордХ рдЕрдкрд░реЗрдЯрд░рд╣рд░реВрдХрд╛ рд▓рд╛рдЧрд┐ == рднрдиреНрджрд╛ рдмрд╛рд╣рд┐рд░ рд░ рддреНрдпрд╕рдкрдЫрд┐ рд╕реНрд╡реЗрдЪреНрдЫрд╛рдЪрд╛рд░реА рдЕрдкрд░реЗрд╕рдирд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ рдирддрд┐рдЬрд╛ рдХреЛрдб рдХрд╕рд░реА рд╕рд╛рдорд╛рдиреНрдпреАрдХрд░рдг рдЧрд░реНрдиреЗ рднрдиреЗрд░ рд╕рд┐рдХрд╛рдЙрдБрдЫред рдмрд╛рдЯреЛрдорд╛, no_unique_address рд╡рд┐рд╢реЗрд╖рддрд╛ (C++20) рд░ lambda рдкреНрд░рдХрд╛рд░реНрдпрд╣рд░реВрдорд╛ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдкреНрдпрд╛рд░рд╛рдорд┐рдЯрд░рд╣рд░реВ (C++20) рдЬрд╕реНрддрд╛ рд╕реБрд╡рд┐рдзрд╛рд╣рд░реВ рдкреНрд░рдпреЛрдЧрдХрд╛ рдЙрджрд╛рд╣рд░рдгрд╣рд░реВ рдкреНрд░рдпреЛрдЧ рдЧрд░реА рд╡реНрдпрд╛рдЦреНрдпрд╛ рдЧрд░рд┐рдПрдХреЛ рдЫред (рд╣реЛ, рдЕрдм lambda рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рд╕рдореНрдЭрди рдЕрдЭ рд╕рдЬрд┐рд▓реЛ рдЫ - рдпреА рд╕рдмреИ рдкреНрд░рдХрд╛рд░рдХрд╛ рдХреЛрд╖реНрдардХрд╣рд░реВрдХреЛ рдЪрд╛рд░ рд▓рдЧрд╛рддрд╛рд░ рдЬреЛрдбреАрд╣рд░реВ рд╣реБрдиреНред) рдХрдиреНрд╕реНрдЯреНрд░рдХреНрдЯрд░ рд╡рд┐рд╡рд░рдгрд╣рд░реВрдХреЛ рд░реВрдкрдорд╛ рдкреНрд░рдХрд╛рд░реНрдпрд╣рд░реВ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреЗ рдЕрдиреНрддрд┐рдо рд╕рдорд╛рдзрд╛рдирд▓реЗ рд╡рд╛рд╕реНрддрд╡рдореИ рдореЗрд░реЛ рдЖрддреНрдорд╛рд▓рд╛рдИ рддрд╛рддреЛ рдмрдирд╛рдЙрдБрдЫ, lambda рдХреЛ рдЙрддреНрдХреГрд╖реНрдЯ рдкрд░рдореНрдкрд░рд╛рд╣рд░реВрдорд╛ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдЯрдкрд▓ рдЙрд▓реНрд▓реЗрдЦ рдирдЧрд░реНрдиреЗред рдХреНрдпрд╛рд▓реНрдХреБрд▓рд╕ред

рдЕрдиреНрддреНрдпрдорд╛, рдпрд╕рд▓рд╛рдИ рдкрд╛рд▓рд┐рд╢ рдЧрд░реНрди рдирдмрд┐рд░реНрд╕рдиреБрд╣реЛрд╕реН:

  • рдпрд╛рдж рдЧрд░реНрдиреБрд╣реЛрд╕реН рдХрд┐ lambdas рдирд┐: рд╢реБрд▓реНрдХ constexpr рдЫрдиреН; 
  • рд╕рд╣реА рдлрд░реНрд╡рд╛рд░реНрдбрд┐рдЩ рдердкреМрдВ рд░ lambda рдХреНрд▓реЛрдЬрд░рдорд╛ рдкреНрдпрд╛рд░рд╛рдорд┐рдЯрд░ рдкреНрдпрд╛рдХрдХреЛ рд╕рдореНрдмрдиреНрдзрдорд╛ рдпрд╕рдХреЛ рдмрджрд╕реВрд░рдд рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ рд╣реЗрд░реМрдВ;
  • рд╕рд╢рд░реНрдд noexcept рдХреЛ рд╕рд╛рде рдЕрдиреБрдХреВрд▓рдирдХрд╛ рд▓рд╛рдЧрд┐ рдХрдореНрдкрд╛рдЗрд▓рд░рд▓рд╛рдИ рдердк рдЕрд╡рд╕рд░рд╣рд░реВ рджрд┐рдиреБрд╣реЛрд╕реН; 
  • рдЯреЗрдореНрдкреНрд▓реЗрдЯрд╣рд░реВрдорд╛ рдердк рдмреБрдЭреНрди рд╕рдХрд┐рдиреЗ рддреНрд░реБрдЯрд┐ рдЖрдЙрдЯрдкреБрдЯрдХреЛ рдЦреНрдпрд╛рд▓ рд░рд╛рдЦреМрдВ, lambdas рдХреЛ рд╕реНрдкрд╖реНрдЯ рдлрд┐рд░реНрддрд╛ рдорд╛рдирд╣рд░реВрдХрд╛ рд▓рд╛рдЧрд┐ рдзрдиреНрдпрд╡рд╛рджред рдпрд╕рд▓реЗ рдХрдореНрдкрд╛рдЗрд▓рд░рд▓рд╛рдИ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдкреНрд░рдХрд╛рд░реНрдп рд╡рд╛рд╕реНрддрд╡рдорд╛ рдХрд▓ рдЧрд░реНрдиреБ рдЕрдШрд┐ рдердк рдЬрд╛рдБрдЪрд╣рд░реВ рдЧрд░реНрди рдмрд╛рдзреНрдп рдкрд╛рд░реНрдЫ - рдЯрд╛рдЗрдк рдЬрд╛рдБрдЪ рдЪрд░рдгрдорд╛ред 

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

рд╣рд╛рдореНрд░рд╛ рдЫрд╛рдкрд╣рд░реВ

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

рдпрд╕реНрддреЛ рдХрд╛рд░реНрдпрдХреНрд░рдордорд╛ рд╕рд╣рднрд╛рдЧреА рд╣реБрдиреЗ рдЕрд╡рд╕рд░рдХреЛ рд▓рд╛рдЧрд┐ рд╣рд╛рдореА рд╕рдореНрдореЗрд▓рди рдЖрдпреЛрдЬрдХрд╣рд░реВрд▓рд╛рдИ рдзрдиреНрдпрд╡рд╛рдж рджрд┐рдиреНрдЫреМрдВ!
рддрдкрд╛рдИрдВрд▓реЗ C++ рд░реВрд╕рдХреЛ рднреВрдд, рд╡рд░реНрддрдорд╛рди рд░ рднрд╡рд┐рд╖реНрдпрдХреЛ рдмрд╛рд░реЗрдорд╛ рдЖрдпреЛрдЬрдХрд╣рд░реВрдХреЛ рдкреЛрд╕реНрдЯ рд╣реЗрд░реНрдиреБрднрдПрдХреЛ рд╣реЛрд▓рд╛ JUG Ru рдмреНрд▓рдЧрдорд╛.

рдкрдвреНрдирдХреЛ рд▓рд╛рдЧрд┐ рдзрдиреНрдпрд╡рд╛рдж, рд░ рд╣рд╛рдореА рдЖрд╢рд╛ рдЧрд░реНрдЫреМрдВ рдХрд┐ рд╣рд╛рдореНрд░реЛ рдШрдЯрдирд╛рд╣рд░реВрдХреЛ рдкреБрди: рд╡рд░реНрдгрди рдЙрдкрдпреЛрдЧреА рдерд┐рдпреЛ!

рд╕реНрд░реЛрдд: www.habr.com

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдердкреНрди