C++ рд░рд╢рд┐рдпрд╛: рд╣реЗ рдХрд╕реЗ рдШрдбрд▓реЗ

рдЬрд░ рдирд╛рдЯрдХрд╛рдЪреНрдпрд╛ рд╕реБрд░реБрд╡рд╛рддреАрд▓рд╛ рддреБрдореНрд╣реА рдореНрд╣рдгрд╛рд▓ рдХреА рднрд┐рдВрддреАрд╡рд░ C++ рдХреЛрдб рдЯрд╛рдВрдЧрд▓реЗрд▓рд╛ рдЖрд╣реЗ, рддрд░ рд╢реЗрд╡рдЯреА рддреЗ рддреБрдордЪреНрдпрд╛ рдкрд╛рдпрд╛рд╡рд░ рдЧреЛрд│реНрдпрд╛ рдШрд╛рд▓рдгрд╛рд░ рдЖрд╣реЗ.

Bjarne Stroustrup

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

рдкрд░рд┐рд╖рджреЗрдЪреА рдореЙрд╕реНрдХреЛ рдЖрд╡реГрддреНрддреА рдкреБрдвреАрд▓ рд╡рд░реНрд╖реА рдПрдкреНрд░рд┐рд▓рдЪреНрдпрд╛ рд╕реБрд░реБрд╡рд╛рддреАрд▓рд╛ рднреЗрдЯ рджреЗрдгреНрдпрд╛рд╕рд╛рдареА рдЙрдкрд▓рдмреНрдз рдЕрд╕реЗрд▓, рдкрд░рдВрддреБ рддреНрдпрд╛рджрд░рдореНрдпрд╛рди рдЖрдордЪреЗ рд╡рд┐рджреНрдпрд╛рд░реНрдереА рддреБрдореНрд╣рд╛рд▓рд╛ рд╢реЗрд╡рдЯрдЪреНрдпрд╛ рдХрд╛рд░реНрдпрдХреНрд░рдорд╛рдд рдХреЛрдгрддреНрдпрд╛ рдордиреЛрд░рдВрдЬрдХ рдЧреЛрд╖реНрдЯреА рд╢рд┐рдХрд▓реНрдпрд╛ рддреЗ рд╕рд╛рдВрдЧрддреАрд▓. 

C++ рд░рд╢рд┐рдпрд╛: рд╣реЗ рдХрд╕реЗ рдШрдбрд▓реЗ

рдкрд╛рд╕реВрди рдлреЛрдЯреЛ рдкрд░рд┐рд╖рдж рдЕрд▓реНрдмрдо

рдУрд╣

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

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

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

рдкрд░рд┐рд╖рдж рд░рдЪрдирд╛

  • рдЕрд╣рд╡рд╛рд▓

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

  • рдЪрд░реНрдЪрд╛ рдЭреЛрди

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

  • рд▓рд╛рдЗрдЯрдирд┐рдВрдЧ рдЪрд░реНрдЪрд╛ рдЖрдгрд┐ рдЕрдиреМрдкрдЪрд╛рд░рд┐рдХ рдЪрд░реНрдЪрд╛

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

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

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

  • рднрд╛рдЧреАрджрд╛рд░ рдЙрднрд╛ рдЖрд╣реЗ

рдХреЙрдиреНрдлрд░рдиреНрд╕рдЪреНрдпрд╛ рднрд╛рдЧреАрджрд╛рд░рд╛рдВрдЪреЗ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рд╣реЙрд▓рдордзреНрдпреЗ рдХреЗрд▓реЗ рдЧреЗрд▓реЗ - рд╕реНрдЯрдБрдбрд╡рд░ рддреНрдпрд╛рдВрдиреА рд╕рдзреНрдпрд╛рдЪреНрдпрд╛ рдкреНрд░рдХрд▓реНрдкрд╛рдВрдмрджреНрджрд▓ рдмреЛрд▓рд▓реЗ, рдЗрдВрдЯрд░реНрдирд╢рд┐рдк рдЖрдгрд┐ рд░реЛрдЬрдЧрд╛рд░рд╛рдЪреА рдСрдлрд░ рджрд┐рд▓реА, рдХреНрд╡рд┐рдЭ рдЖрдгрд┐ рд▓рд╣рд╛рди рд╕реНрдкрд░реНрдзрд╛ рдЖрдпреЛрдЬрд┐рдд рдХреЗрд▓реНрдпрд╛ рдЖрдгрд┐ рдЫрд╛рди рдмрдХреНрд╖рд┐рд╕реЗ рджреЗрдЦреАрд▓ рджрд┐рд▓реА. рддреНрдпрд╛рдЪ рд╡реЗрд│реА, рдХрд╛рд╣реА рдХрдВрдкрдиреНрдпрд╛рдВрдиреА рдореБрд▓рд╛рдЦрддреАрдЪреНрдпрд╛ рд╕реБрд░реБрд╡рд╛рддреАрдЪреНрдпрд╛ рдЯрдкреНрдкреНрдпрд╛рдд рдЬрд╛рдгреНрдпрд╛рдЪреА рдСрдлрд░ рджреЗрдЦреАрд▓ рджрд┐рд▓реА, рдЬреЗ рдХреЗрд╡рд│ рдЕрд╣рд╡рд╛рд▓ рдРрдХрдгреНрдпрд╛рд╕рд╛рдареА рдЖрд▓реЗ рдирд╛рд╣реАрдд рддреНрдпрд╛рдВрдЪреНрдпрд╛рд╕рд╛рдареА рдЙрдкрдпреБрдХреНрдд рдард░реВ рд╢рдХрддрд╛рдд.

рдЕрд╣рд╡рд╛рд▓рд╛рдВрдЪреЗ рддрд╛рдВрддреНрд░рд┐рдХ рддрдкрд╢реАрд▓

рдЖрдореНрд╣реА рджреЛрдиреНрд╣реА рджрд┐рд╡рд╕ рдЕрд╣рд╡рд╛рд▓ рдРрдХрд▓реЗ. рдХрдзреАрдХрдзреА рд╕рдорд╛рдВрддрд░ рдЕрд╣рд╡рд╛рд▓рд╛рдВрдордзреВрди рдПрдХ рдЕрд╣рд╡рд╛рд▓ рдирд┐рд╡рдбрдгреЗ рдХрдареАрдг рд╣реЛрддреЗ - рдЖрдореНрд╣реА рд╡рд┐рднрдХреНрдд рд╣реЛрдгреНрдпрд╛рд╕ рдЖрдгрд┐ рд╡рд┐рд╢реНрд░рд╛рдВрддреА рджрд░рдореНрдпрд╛рди рдорд┐рд│рд╛рд▓реЗрд▓реНрдпрд╛ рдЬреНрдЮрд╛рдирд╛рдЪреА рджреЗрд╡рд╛рдгрдШреЗрд╡рд╛рдг рдХрд░рдгреНрдпрд╛рд╕ рд╕рд╣рдорддреА рджрд┐рд▓реА. рдЖрдгрд┐ рдЕрд╕реЗ рдЕрд╕рддрд╛рдирд╛рд╣реА рдмрд░реЗрдЪ рдХрд╛рд╣реА рд╢рд┐рд▓реНрд▓рдХ рд░рд╛рд╣рд┐рд▓реЗрд▓реЗ рджрд┐рд╕рддреЗ. рдпреЗрдереЗ рдЖрдореНрд╣реА рдХрд╛рд╣реА рдЕрд╣рд╡рд╛рд▓рд╛рдВрдЪреНрдпрд╛ рд╕рд╛рдордЧреНрд░реАрдмрджреНрджрд▓ рдмреЛрд▓реВ рдЗрдЪреНрдЫрд┐рддреЛ рдЬреЗ рдЖрдореНрд╣рд╛рд▓рд╛ рд╕рд░реНрд╡рд╛рдд рдордиреЛрд░рдВрдЬрдХ рд╡рд╛рдЯрд▓реЗ

рдХрдореНрдкрд╛рдпрд▓рд░ рдСрдкреНрдЯрд┐рдорд╛рдпрдЭреЗрд╢рдирдЪреНрдпрд╛ рдкреНрд░рд┐рдЭрдорджреНрд╡рд╛рд░реЗ C++ рдордзреАрд▓ рдЕрдкрд╡рд╛рдж, рд░реЛрдорди рд░реБрд╕реНрдпрд╛рдПрд╡

C++ рд░рд╢рд┐рдпрд╛: рд╣реЗ рдХрд╕реЗ рдШрдбрд▓реЗ
рдкрд╛рд╕реВрди рд╕реНрд▓рд╛рдЗрдб рдХрд░рд╛ рд╕рд╛рджрд░реАрдХрд░рдгреЗ

рд╢реАрд░реНрд╖рдХрд╛рдд рд╕реБрдЪрд╡рд┐рд▓реНрдпрд╛рдкреНрд░рдорд╛рдгреЗ, рд░реЛрдордирдиреЗ рдЙрджрд╛рд╣рд░рдг рдореНрд╣рдгреВрди LLVM рд╡рд╛рдкрд░реВрди рдЕрдкрд╡рд╛рджрд╛рдВрд╕рд╣ рдХрд╛рдо рдХрд░рдгреНрдпрд╛рдХрдбреЗ рдкрд╛рд╣рд┐рд▓реЗ. рддреНрдпрд╛рдЪ рд╡реЗрд│реА, рдЬреЗ рд▓реЛрдХ рддреНрдпрд╛рдВрдЪреНрдпрд╛ рдХрд╛рдорд╛рдд рдХреНрд▓реЕрдВрдЧ рд╡рд╛рдкрд░рдд рдирд╛рд╣реАрдд рддреНрдпрд╛рдВрдЪреНрдпрд╛рд╕рд╛рдареА, рдХреЛрдб рд╕рдВрднрд╛рд╡реНрдпрддрдГ рдХрд╕рд╛ рдСрдкреНрдЯрд┐рдорд╛рдЗрдЭ рдХреЗрд▓рд╛ рдЬрд╛рдК рд╢рдХрддреЛ рдпрд╛рдЪреА рдХрд╛рд╣реА рдХрд▓реНрдкрдирд╛ рдпрд╛ рдЕрд╣рд╡рд╛рд▓рд╛рдд рджрд┐рд▓реА рдЬрд╛рдК рд╢рдХрддреЗ. рд╣реЗ рдЕрд╕реЗ рдЖрд╣реЗ рдХрд╛рд░рдг рдХрдВрдкрд╛рдпрд▓рд░ рдЖрдгрд┐ рд╕рдВрдмрдВрдзрд┐рдд рдорд╛рдирдХ рд▓рд╛рдпрдмреНрд░рд░реАрдВрдЪреЗ рд╡рд┐рдХрд╕рдХ рдПрдХрдореЗрдХрд╛рдВрд╢реА рд╕рдВрд╡рд╛рдж рд╕рд╛рдзрддрд╛рдд рдЖрдгрд┐ рдЕрдиреЗрдХ рдпрд╢рд╕реНрд╡реА рдирд┐рд░рд╛рдХрд░рдгреЗ рдПрдХрд░реВрдк рд╣реЛрдК рд╢рдХрддрд╛рдд.

рдореНрд╣рдгреВрди, рдЕрдкрд╡рд╛рдж рд╣рд╛рддрд╛рд│рдгреНрдпрд╛рд╕рд╛рдареА, рддреБрдореНрд╣рд╛рд▓рд╛ рдмрд░реНтАНрдпрд╛рдЪ рдЧреЛрд╖реНрдЯреА рдХрд░рд╛рд╡реНрдпрд╛ рд▓рд╛рдЧрддреАрд▓: рд╣рдБрдбрд▓рд┐рдВрдЧ рдХреЛрдб (рдЕрд╕рд▓реНрдпрд╛рд╕) рдХрд┐рдВрд╡рд╛ рд╕рдзреНрдпрд╛рдЪреНрдпрд╛ рд╕реНрддрд░рд╛рд╡рд░ рд╡рд┐рдирд╛рдореВрд▓реНрдп рд╕рдВрд╕рд╛рдзрдирд╛рдВрд╡рд░ рдХреЙрд▓ рдХрд░рд╛ рдЖрдгрд┐ рд╕реНрдЯреЕрдХрд▓рд╛ рдЕрдзрд┐рдХ рд╕реНрдкрд┐рди рдХрд░рд╛. рд╣реЗ рд╕рд░реНрд╡ рдпрд╛ рд╡рд╕реНрддреБрд╕реНрдерд┐рддреАрдХрдбреЗ рдиреЗрдд рдЖрд╣реЗ рдХреА рдХреЙрдореНрдкрд╛рдпрд▓рд░ рд╕рдВрднрд╛рд╡реНрдпрдд: рдЕрдкрд╡рд╛рдж рдЯрд╛рдХрдгрд╛рд▒реНрдпрд╛ рдХреЙрд▓рд╕рд╛рдареА рдЕрддрд┐рд░рд┐рдХреНрдд рд╕реВрдЪрдирд╛ рдЬреЛрдбрддреЛ. рдореНрд╣рдгреВрди, рдЬрд░ рдЕрдкрд╡рд╛рдж рдкреНрд░рддреНрдпрдХреНрд╖рд╛рдд рдЙрдкрд╕реНрдерд┐рдд рдХреЗрд▓рд╛ рдЧреЗрд▓рд╛ рдирд╛рд╣реА, рддрд░ рдХрд╛рд░реНрдпрдХреНрд░рдо рддрд░реАрд╣реА рдЕрдирд╛рд╡рд╢реНрдпрдХ рдХреНрд░рд┐рдпрд╛ рдХрд░реЗрд▓. рдХреЛрдгрддреНрдпрд╛рд╣реА рдкреНрд░рдХрд╛рд░реЗ рдУрд╡реНрд╣рд░рд╣реЗрдб рдХрдореА рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА, LLVM рдордзреНрдпреЗ рдЕрдкрд╡рд╛рдж рд╣рд╛рддрд╛рд│рдгреА рдХреЛрдб рдЬреЛрдбрдгреНрдпрд╛рдЪреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╛рд╣реА рдХрд┐рдВрд╡рд╛ "рдЕрддрд┐рд░рд┐рдХреНрдд" рд╕реВрдЪрдирд╛рдВрдЪреА рд╕рдВрдЦреНрдпрд╛ рдХрдореА рдХреЗрд▓реА рдЬрд╛рдК рд╢рдХрддреЗ рдЕрд╢рд╛ рдкрд░рд┐рд╕реНрдерд┐рддреАрдЪреЗ рдирд┐рд░реНрдзрд╛рд░рдг рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдЕрдиреЗрдХ рд╣реЗрд░рд┐рд╕реНрдЯрд┐рдХреНрд╕ рдЖрд╣реЗрдд.

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

рдЕрд╢рд╛ рдкреНрд░рдХрд╛рд░реЗ, рд░реЛрдорди рд░реБрд╕реНрдпрд╛рдПрд╡ рд╡рд┐рджреНрдпрд╛рд░реНрдереНрдпрд╛рдВрдирд╛ рдпрд╛ рдирд┐рд╖реНрдХрд░реНрд╖рд╛рдкрд░реНрдпрдВрдд рдкреЛрд╣реЛрдЪрд╡рддрд╛рдд рдХреА рдЕрдкрд╡рд╛рдж рд╣рд╛рддрд╛рд│рдгреА рдЕрд╕рд▓реЗрд▓рд╛ рдХреЛрдб рдиреЗрд╣рдореА рд╢реВрдиреНрдп рдУрд╡реНрд╣рд░рд╣реЗрдбрд╕рд╣ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХреЗрд▓рд╛ рдЬрд╛рдК рд╢рдХрдд рдирд╛рд╣реА рдЖрдгрд┐ рдЦрд╛рд▓реАрд▓ рд╕рд▓реНрд▓рд╛ рджреЗрддреЛ:

  • рд▓рд╛рдпрдмреНрд░рд░реА рд╡рд┐рдХрд╕рд┐рдд рдХрд░рддрд╛рдирд╛, рддрддреНрддреНрд╡рддрдГ рдЕрдкрд╡рд╛рдж рд╕реЛрдбреВрди рджреЗрдгреЗ рдпреЛрдЧреНрдп рдЖрд╣реЗ;
  • рдЕрдкрд╡рд╛рдж рдЕрдЬреВрдирд╣реА рдЖрд╡рд╢реНрдпрдХ рдЕрд╕рд▓реНрдпрд╛рд╕, рдЬреЗрд╡реНрд╣рд╛ рд╢рдХреНрдп рдЕрд╕реЗрд▓ рддреЗрд╡реНрд╣рд╛ рд╕рд░реНрд╡рддреНрд░ noexcept (рдЖрдгрд┐ const) рдореЙрдбрд┐рдлрд╛рдпрд░реНрд╕ рдЬреЛрдбрдгреЗ рдлрд╛рдпрджреЗрд╢реАрд░ рдЖрд╣реЗ рдЬреЗрдгреЗрдХрд░реВрди рдХрдВрдкрд╛рдЗрд▓рд░ рд╢рдХреНрдп рддрд┐рддрдХреЗ рдСрдкреНрдЯрд┐рдорд╛рдЗрдЭ рдХрд░реВ рд╢рдХреЗрд▓.

рд╕рд░реНрд╡рд╕рд╛рдзрд╛рд░рдгрдкрдгреЗ, рд╕реНрдкреАрдХрд░рдиреЗ рдпрд╛ рдорддрд╛рдЪреА рдкреБрд╖реНрдЯреА рдХреЗрд▓реА рдХреА рдЕрдкрд╡рд╛рдж рдХрдореАрддрдХрдореА рд╡рд╛рдкрд░рд▓реЗ рдЬрд╛рддрд╛рдд рдХрд┐рдВрд╡рд╛ рдкреВрд░реНрдгрдкрдгреЗ рд╕реЛрдбреВрди рджрд┐рд▓реЗ рдЬрд╛рддрд╛рдд.

рдЕрд╣рд╡рд╛рд▓рд╛рдЪреНрдпрд╛ рд╕реНрд▓рд╛рдЗрдбреНрд╕ рдкреБрдвреАрд▓ рд▓рд┐рдВрдХрд╡рд░ рдЙрдкрд▓рдмреНрдз рдЖрд╣реЗрдд: [тАЬLLVM рдХрдВрдкрд╛рдЗрд▓рд░ рдСрдкреНрдЯрд┐рдорд╛рдпрдЭреЗрд╢рдирдЪреНрдпрд╛ рд▓реЗрдиреНрд╕рджреНрд╡рд╛рд░реЗ C++ рдЕрдкрд╡рд╛рджтАЭ]

рдЬрдирд░реЗрдЯрд░, рдХреЛрд░реЛрдЯреАрди рдЖрдгрд┐ рдЗрддрд░ рдореЗрдВрджреВ-рдЕрдирд░реЛрд▓рд┐рдВрдЧ рдЧреЛрдбрдкрдгрд╛, рдЖрджрд┐ рд╢рд╡рд┐рдд

C++ рд░рд╢рд┐рдпрд╛: рд╣реЗ рдХрд╕реЗ рдШрдбрд▓реЗ
рдкрд╛рд╕реВрди рд╕реНрд▓рд╛рдЗрдб рдХрд░рд╛ рд╕рд╛рджрд░реАрдХрд░рдгреЗ

C++20 рдордзреАрд▓ рдирд╡рдХрд▓реНрдкрдирд╛рдВрдирд╛ рд╕рдорд░реНрдкрд┐рдд рдпрд╛ рдкрд░рд┐рд╖рджреЗрддреАрд▓ рдЕрдиреЗрдХ рдЕрд╣рд╡рд╛рд▓рд╛рдВрдкреИрдХреА рдПрдХ рдЕрд╣рд╡рд╛рд▓ рдХреЗрд╡рд│ рддреНрдпрд╛рдЪреНрдпрд╛ рд░рдВрдЧреАрдд рд╕рд╛рджрд░реАрдХрд░рдгрд╛рд╕рд╛рдареАрдЪ рдирд╡реНрд╣реЗ, рддрд░ рд╕рдВрдЧреНрд░рд╣ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рддрд░реНрдХрд╢рд╛рд╕реНрддреНрд░рд╛рддреАрд▓ (рд▓реВрдк, рдХреЙрд▓рдмреЕрдХрд╕рд╛рдареА) рд╡рд┐рджреНрдпрдорд╛рди рд╕рдорд╕реНрдпрд╛рдВрдЪреНрдпрд╛ рд╕реНрдкрд╖реНрдЯ рдУрд│рдЦреАрд╕рд╛рдареА рджреЗрдЦреАрд▓ рд╕рдВрд╕реНрдорд░рдгреАрдп рд╣реЛрддрд╛.

рдЖрджрд┐ рд╢рд╡рд┐рдд рдЦрд╛рд▓реАрд▓ рдЧреЛрд╖реНрдЯреАрдВрд╡рд░ рдкреНрд░рдХрд╛рд╢ рдЯрд╛рдХрддрд╛рдд: рд╕рдзреНрдпрд╛ рдЙрдкрд▓рдмреНрдз рдкрджреНрдзрддреА рд╕рдВрдкреВрд░реНрдг рд╕рдВрдЧреНрд░рд╣рд╛рддреВрди рдЬрд╛рддрд╛рдд рдЖрдгрд┐ рдХрд╛рд╣реА рдЕрдВрддрд░реНрдЧрдд рдордзреНрдпрд╡рд░реНрддреА рд╕реНрдерд┐рддреАрдд рдкреНрд░рд╡реЗрд╢ рдкреНрд░рджрд╛рди рдХрд░рдд рдирд╛рд╣реАрдд (рдХрд┐рдВрд╡рд╛ рддреЗ рдХреЙрд▓рдмреЕрдХрдЪреНрдпрд╛ рдмрд╛рдмрддреАрдд рдХрд░рддрд╛рдд, рдкрд░рдВрддреБ рдореЛрдареНрдпрд╛ рд╕рдВрдЦреНрдпреЗрдиреЗ рдЕрдкреНрд░рд┐рдп рджреБрд╖реНрдкрд░рд┐рдгрд╛рдорд╛рдВрд╕рд╣, рдЬрд╕реЗ рдХреА рдХреЙрд▓рдмреЕрдХ рд╣реЗрд▓) . рдЕрд╕реЗ рджрд┐рд╕рддреЗ рдХреА рддреЗрдереЗ рдкреБрдирд░рд╛рд╡реГрддреНрддреА рдХрд░рдгрд╛рд░реЗ рдЖрд╣реЗрдд, рдкрд░рдВрддреБ рддреНрдпрд╛рдВрдЪреНрдпрд╛рд╕рд╣ рд╕рд░реНрд╡ рдХрд╛рд╣реА рдЗрддрдХреЗ рдЧреБрд│рдЧреБрд│реАрдд рдирд╛рд╣реА: рддреЗрдереЗ рдХреЛрдгрддреЗрд╣реА рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рд╡реЗрд╢ рдЖрдгрд┐ рдирд┐рд░реНрдЧрдорди рдмрд┐рдВрджреВ рдирд╛рд╣реАрдд (рдкреНрд░рд╛рд░рдВрдн тЖТ рд╢реЗрд╡рдЯ рд╡рд┐рд░реБрджреНрдз 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 рдлрд╛рдИрд▓рдордзреНрдпреЗ рд╣рд▓рд╡рд▓реЗ: рдЖрдореНрд╣рд╛рд▓рд╛ рдЧреБрдВрдбрд╛рд│рд▓реЗрд▓реНрдпрд╛ API рдЪреЗ рдлреЙрд░рд╡рд░реНрдб-рдбрд┐рдХреНрд▓реЗрд░реЗрд╢рди рддрд╕реЗрдЪ 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++ рдпреБрдХреНрддреНрдпрд╛"]

рддреБрдордЪрд╛ рдХреЛрдб рдбреНрд░рд╛рдп рдареЗрд╡рдгреНрдпрд╛рд╕рд╛рдареА рдЖрдзреБрдирд┐рдХ рддрдВрддреНрд░реЗ, рдмреНрдпреЛрд░реНрди рдлрд╛рд╣рд▓рд░

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

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) рдордзреНрдпреЗ рдСрдЯреЛ рд╡рд╛рдкрд░реВрди, рджреГрд╖реНрдЯреАрдХреЛрди рдлрдХреНрдд рд╕реНрдЯреЗрдЯ_рдЯрд╛рдЗрдк рдШрдЯрдХрд╛рдВрд╕реЛрдмрддрдЪ рдирд╡реНрд╣реЗ рддрд░ рдиреЙрди-рдЯрд╛рдЗрдк рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдкреЕрд░рд╛рдореАрдЯрд░реНрд╕ рдореНрд╣рдгреВрди рд╡рд╛рдкрд░рд▓реНрдпрд╛ рдЬрд╛рдК рд╢рдХрдгрд╛рд░реНтАНрдпрд╛ рдЖрджрд┐рдо рдкреНрд░рдХрд╛рд░рд╛рдВрд╕рд╣ рддреБрд▓рдирд╛ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рд╕рд╛рдорд╛рдиреНрдпреАрдХрд░рдг рдХрд░рддреЛ:


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);

рдпрд╛ рдЙрджрд╛рд╣рд░рдгрд╛рдордзреНрдпреЗ, рд╡рдЬрд╛рд╡рдЯ рдорд╛рд░реНрдЧрджрд░реНрд╢рдХ рдХрдВрдкрд╛рдпрд▓рд░рд▓рд╛ рдЗрдЪреНрдЫрд┐рдд рд╕рдВрд░рдЪрдирд╛ рдЯреЗрдореНрдкрд▓реЗрдЯ рдкреЕрд░рд╛рдореАрдЯрд░реНрд╕ рд╕реБрдЪрд╡рдгреНрдпрд╛рд╕рд╛рдареА рдХрд╛рд░реНрдп рдХрд░рддреЗ, рдЬреНрдпрд╛рд▓рд╛ рдХрдиреНрд╕реНрдЯреНрд░рдХреНрдЯрд░ рд╡рд┐рддрд░реНрдХрд╛рдВрдЪреЗ рдкреНрд░рдХрд╛рд░ рдорд╛рд╣рд┐рдд рдЕрд╕рддрд╛рдд. 

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

рд╢реЗрд╡рдЯреА, рддреЗ рдкреЙрд▓рд┐рд╢ рдХрд░рдгреНрдпрд╛рд╕ рд╡рд┐рд╕рд░реВ рдирдХрд╛:

  • рд▓рдХреНрд╖рд╛рдд рдареЗрд╡рд╛ рдХреА lambdas рд╡рд┐рдирд╛рдореВрд▓реНрдп рдЖрд╣реЗрдд constexpr; 
  • рдЪрд▓рд╛ рдкрд░рд┐рдкреВрд░реНрдг рдлреЙрд░рд╡рд░реНрдбрд┐рдВрдЧ рдЬреЛрдбреВ рдЖрдгрд┐ рд▓реЕрдореНрдмрдбрд╛ рдХреНрд▓реЛрдЬрд░рдордзреАрд▓ рдкреЕрд░рд╛рдореАрдЯрд░ рдкреЕрдХрдЪреНрдпрд╛ рд╕рдВрдмрдВрдзрд╛рдд рддреНрдпрд╛рдЪреЗ рдХреБрд░реВрдк рд╡рд╛рдХреНрдпрд░рдЪрдирд╛ рдкрд╛рд╣реВ;
  • рдХрдВрдкрд╛рдЗрд▓рд░рд▓рд╛ рдХрдВрдбрд┐рд╢рдирд▓ рдиреЛрдПрдХреНтАНрд╕реНтАНрдкреНтАНрдкреНтАНрдЯрд╕рд╣ рдСрдкреНрдЯрд┐рдорд╛рдпрдЭреЗрд╢рдирд╕рд╛рдареА рдЕрдзрд┐рдХ рд╕рдВрдзреА рджреЗрдК рдпрд╛; 
  • рд▓реЕрдореНрдмрдбрд╛рд╕рдЪреНрдпрд╛ рд╕реНрдкрд╖реНрдЯ рд░рд┐рдЯрд░реНрди рд╡реНрд╣реЕрд▓реНрдпреВрдЬрдореБрд│реЗ рдЯреЗрдореНрдкрд▓реЗрдЯреНрд╕рдордзреНрдпреЗ рдЕрдзрд┐рдХ рд╕рдордЬрдгреНрдпрд╛рдпреЛрдЧреНрдп рддреНрд░реБрдЯреА рдЖрдЙрдЯрдкреБрдЯрдЪреА рдХрд╛рд│рдЬреА рдШреЗрдКрдпрд╛. рд╣реЗ рдХрдВрдкрд╛рдЗрд▓рд░рд▓рд╛ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдлрдВрдХреНрд╢рди рдкреНрд░рддреНрдпрдХреНрд╖рд╛рдд рдХреЙрд▓ рдХрд░рдгреНрдпрд╛рдкреВрд░реНрд╡реА рдЕрдзрд┐рдХ рддрдкрд╛рд╕рдгреНрдпрд╛ рдХрд░рдгреНрдпрд╛рд╕ рднрд╛рдЧ рдкрд╛рдбреЗрд▓ - рдЯрд╛рдЗрдк рддрдкрд╛рд╕рдгреНрдпрд╛рдЪреНрдпрд╛ рдЯрдкреНрдкреНрдпрд╛рд╡рд░. 

рддрдкрд╢реАрд▓рд╛рдВрд╕рд╛рдареА, рдХреГрдкрдпрд╛ рд╡реНрдпрд╛рдЦреНрдпрд╛рди рд╕рд╛рдордЧреНрд░реА рдкрд╣рд╛: 

рдЖрдордЪреЗ рдЗрдВрдкреНрд░реЗрд╢рди

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

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

рд╡рд╛рдЪрд▓реНрдпрд╛рдмрджреНрджрд▓ рдзрдиреНрдпрд╡рд╛рдж, рдЖрдгрд┐ рдЖрдореНрд╣рд╛рд▓рд╛ рдЖрд╢рд╛ рдЖрд╣реЗ рдХреА рдЖрдордЪреЗ рдХрд╛рд░реНрдпрдХреНрд░рдо рдкреБрдиреНрд╣рд╛ рд╕рд╛рдВрдЧрдгреЗ рдЙрдкрдпреБрдХреНрдд рдард░рд▓реЗ!

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

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЬреЛрдбрд╛