рджреВрд╕рд░реЗ рджрд┐рди рдмреЗрд▓рдлрд╛рд╕реНрдЯ рдореЗрдВ C ++ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛ рдХреЗ рдорд╛рдирдХреАрдХрд░рдг рдХреЗ рд▓рд┐рдП рд╕рдорд┐рддрд┐ рдХреА рдмреИрдардХ рд╣реБрдИред C ++ 20 рдкрд░ рд▓рдЧрднрдЧ 400 рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдиреЗ рджреЗрд╢ рдХреЗ рдкреНрд░рддрд┐рдирд┐рдзрд┐рдпреЛрдВ рд╕реЗ рд╕рдорд┐рддрд┐ рдХреЗ рд▓рд┐рдП рдЙрдбрд╝рд╛рди рднрд░реА, рдФрд░ рдЙрдирдореЗрдВ рд╕реЗ рдЖрдзреЗ рдЗрд╕рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдореЗрдВ рдХрд╛рдордпрд╛рдм рд░рд╣реЗред
рдХрдЯреМрддреА рдХреЗ рддрд╣рдд рдЖрдк рд░реВрд╕реА рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ (рд╣рд╛рдВ, C ++ 20 рдкрд░ рдЖрдкрдХреА рдЯрд┐рдкреНрдкрдгреА), рдЕрдиреНрдп рджреЗрд╢реЛрдВ рдХреА рдХреБрдЫ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдФрд░ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЙрдкрдпреБрдХреНрдд рдирдП C ++ 23 (рдирд┐рд╖реНрдкрд╛рджрдирдХрд░реНрддрд╛рдУрдВ!) рдХреА рдЪрд░реНрдЪрд╛ рдХреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВред
C ++ рдХреЗ рд╕рд╛рде рдЙрди рд╕рднреА рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рдЬрд┐рди рд▓реЛрдЧреЛрдВ рдиреЗ рд╕рд╛рдЗрдЯ рдкрд░ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИ
stdcpp.ru , рдЪреИрдЯ
@ProCxx рдореЗрдВ ,
Yandex.Taxi рдореЗрдВ рдХрд╛рдо рдкрд░, рдпрд╛ рд╕рдореНрдореЗрд▓рдиреЛрдВ рдореЗрдВ рд╡реНрдпрдХреНрддрд┐ рдореЗрдВ, рд╣рдордиреЗ C ++ 20 рдкрд░ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдФрдкрдЪрд╛рд░рд┐рдХ рд░реВрдк рджрд┐рдпрд╛ред рдФрд░ рдЗрд╕рд▓рд┐рдП рдпрд╣ рдХреНрдпрд╛ рдЖрдпрд╛ ...
std :: atomic <int> a {}; рдФрд░ std :: рдкрд░рдорд╛рдгреБ <int> b;
рдпрд╣ рдЕрдЬреАрдм рд▓рдЧ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЪрд░
рдП рдФрд░
рдмреА 0. рдХреЗ рд▓рд┐рдП рдЖрд░рдВрднреАрдХреГрдд рдирд╣реАрдВ
рд╣реИрдВ ред рдПрдХ рдкрд░рдорд╛рдгреБ рдЪрд░ рдХреЛ рд╢реВрдиреНрдп рд╕реЗ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, {0} рдХреЗ рд╕рд╛рде рдмрд┐рд▓реНрдХреБрд▓ std :: atomic <int> рд▓рд┐рдЦрдирд╛ рдЖрд╡рд╢реНрдпрдХ рдерд╛;
рдпрд╣ рд╡реНрдпрд╡рд╣рд╛рд░ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рд╣реИ, рдФрд░ рдХрдИ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдиреЗ рдЦреБрдж рдХреЛ рдЬрд▓рд╛ рджрд┐рдпрд╛ред рд╕рдорд┐рддрд┐ рдиреЗ рдорд╛рдирдХ рдкрд░ рд╣рдорд╛рд░реА рдЯрд┐рдкреНрдкрдгреА рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░ рд▓рд┐рдпрд╛, рдФрд░ рд╕реА ++ 20 рдореЗрдВ, std :: atomic_flag рдФрд░ std :: atomic рдХреЗ рд▓рд┐рдП рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдирд┐рд░реНрдорд╛рдгрдХрд░реНрддрд╛ рдХреНрд░рдорд╢рдГ
рд╕реНрдкрд╖реНрдЯ рдЕрд╡рд╕реНрдерд╛ рдФрд░ T () рдореЗрдВ рдЪрд░ рдХреА рд╢реБрд░реБрдЖрдд рдХрд░реЗрдВрдЧреЗред
рдПрд╕рдЯреАрдбреА :: рд▓реЙрдВрдбрд░
C ++ 17 рдХреЗ рд╕рд╛рде рд╢реБрд░реВ, рдорд╛рдирдХ рдореЗрдВ рдПрдХ рдбрд░рд╛рд╡рдирд╛ рдлрд╝рдВрдХреНрд╢рди std :: launder рд╣реИред рд╕рдорд┐рддрд┐ рдХреЗ рд▓реЛрдЧреЛрдВ рдиреЗ рд╕реЛрдЪрд╛ рдХрд┐ рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдбреЗрд╡рд▓рдкрд░реНрд╕ рдФрд░ рд╕рд╛рдорд╛рдиреНрдп рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдПрдВрдЧреЗ рдХрд┐ рдЗрд╕рд╕реЗ рдХреИрд╕реЗ рдирд┐рдкрдЯрдирд╛ рд╣реИред
рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ, рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ рдХреБрдЫ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рдмрд╣реБрдд рд╣реА рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рд╕рд┐рджреНрдзрд╛рдВрдд рдореЗрдВ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
struct C { const int c; }; std::vector<C> v = {C{1}}; v.pop_back(); v.push_back(C{2}); assert(v.back().c == 2);
рдпрджрд┐ рдЖрдк рдорд╛рдирдХ рдХреЗ рдЕрдХреНрд╖рд░ рдХрд╛ рдХрдбрд╝рд╛рдИ рд╕реЗ рдкрд╛рд▓рди рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рд╕рдВрдХрд▓рдХ рдФрд░ рдЪрдВрджреНрд░рдорд╛ рдЪрд░рдг рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ, рдореБрдЦрд░ рдкрд╛рд╕ рдпрд╛ рд╡рд┐рдлрд▓ рд╣реЛ рд╕рдХрддреА рд╣реИрдВред
рд╕рдорд╕реНрдпрд╛ рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░рддреЗ рд╕рдордп, рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ рдЕрдиреБрдХреВрд▓рди, рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдорд╛рдирдХ рдиреЗ рдЗрд╕ рддрд░рд╣ рдХреЗ рдЕрдЬреАрдм рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд╛ рд╡рд░реНрдгрди рдХрд┐рдпрд╛ рдерд╛, рдХреЗрд╡рд▓ рдПрдХ рдХрдВрдкрд╛рдЗрд▓рд░ рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдФрд░ рдПрдХ рдореВрд░реНрдд рдкреНрд░рджрд░реНрд╢рди рдХреЛ рдмрдврд╝рд╛рд╡рд╛ рдирд╣реАрдВ рджрд┐рдпрд╛ рдерд╛ред
рдЗрд╕рд▓рд┐рдП C ++ 20 рд╕реЗ рд╢реБрд░реВ рдХрд░рдХреЗ, рдЖрдк рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рд▓рд┐рдВрдХ рдХреЗ рд╕рд╛рде рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЛ рд╕реНрдЯреЛрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ std рдореЗрдВ рдирд┐рд░рдВрддрд░ рдлрд╝реАрд▓реНрдб :: рд╡реИрдХрд▓реНрдкрд┐рдХ, std :: variant, std :: рд╡реЗрдХреНрдЯрд░, std :: deque, рдЖрджрд┐ред рдЕрдм рдкреНрд▓реЗрд╕рдореЗрдВрдЯ рдирдпрд╛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ std рд▓реЙрдЬрд┐рдХ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИ: : рд▓рд╛рдВрдбреНрд░ред
* рдпрд╣ рдирд┐рд░реНрдорд╛рдгрдХрд░реНрддрд╛рдУрдВ рдореЗрдВ
рдпрд╣ рдЙрди рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИ рдЬрд╣рд╛рдВ рдПрдХ рд╡рд┐рдлрд▓рддрд╛ рдиреЗ рд╣рдорд╛рд░рд╛ рдЗрдВрддрдЬрд╛рд░ рдХрд┐рдпрд╛:
struct C { C(C&& other) noexcept : initial_(other.initial_) , secondary_(other.initial_)
рд╡рд░реНрддрдорд╛рди рдирд┐рдпрдореЛрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░,
O_O рдХреЗ рд╕рд╛рде рд▓рд╛рдЗрди рдореЗрдВ
, рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЛ рдпрд╣ рдорд╛рдирдиреЗ рдХрд╛ рдЕрдзрд┐рдХрд╛рд░ рд╣реИ рдХрд┐ рдЕрдиреНрдп == рдпрд╣ рдФрд░, рддрджрдиреБрд╕рд╛рд░, рдПрдХ рдкрдВрдХреНрддрд┐ рдКрдкрд░, рд╣рдордиреЗ рдЕрдиреНрдп.in_ рдХрд╛ рдорд╛рди рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рдлрд┐рд░ рд╕реЗ рдкрдврд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рд╕рдВрдХрд▓рдХ рдХреЛ рдпрд╣ рдорд╛рдирдиреЗ рдХрд╛ рдЕрдзрд┐рдХрд╛рд░ рд╣реИ рдХрд┐ рдПрдХ рд╡рд░реНрдЧ рдЬреЛ рдЕрднреА рддрдХ рдирд╣реАрдВ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЙрд╕ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд╕рд╛рде рдЕрд▓рд┐рдпрд╛рд╕ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрд┐рд╕рд╕реЗ рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдЗрд╕ рд╡рдЬрд╣ рд╕реЗ рдпрд╣ рдЧреИрд░-рдЗрд╖реНрдЯрддрдо рдХреЛрдб рдЙрддреНрдкрдиреНрди рдХрд░ рд╕рдХрддрд╛ рд╣реИред
рдХреБрдЫ рд╕рдВрдХрд▓рдХ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЬреАрд╕реАрд╕реА) рдХрд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрд╕ рддрд░рд╣ рдХреЗ рдЕрдкрдорд╛рди рдХреЛ рдирд╣реАрдВ рд▓рд┐рдЦрддреЗ рд╣реИрдВ, рдФрд░ рдорд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдЕрд▓рд┐рдпрд╛рд╕рд┐рдВрдЧ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИред
рд╕рдорд┐рддрд┐ рдиреЗ рд╣рдорд╛рд░реА рдЯрд┐рдкреНрдкрдгреА рдХреЛ рдЕрд╕реНрд╡реАрдХрд╛рд░ рдХрд░ рджрд┐рдпрд╛ "рдЪрд▓реЛ рдорд╛рди рд▓реЗрддреЗ рд╣реИрдВ рдХрд┐ рдЕрд▓рд┐рдпрд╛рд╕рд┐рдВрдЧ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИ"ред рдЬреИрд╕рд╛ рдХрд┐ рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ, рдХреБрдЫ рдХреЛрдбрдмреЗрд╕ рдореЗрдВ рдбрд░рд╛рд╡рдиреЗ рд╣реИрдХ рд╣реЛрддреЗ рд╣реИрдВ рдЬрд╣рд╛рдВ & == рдпрд╣, рдФрд░ рд▓реЛрдЧ рдЕрднреА рддрдХ рдЙрдиреНрд╣реЗрдВ рдЕрд▓рд╡рд┐рджрд╛ рдХрд╣рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рдирд╣реАрдВ рд╣реИрдВред
рдСрдкрд░реЗрдЯрд░ <=> рдФрд░ рдПрдореНрдмреЗрдбреЗрдб рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ
рд╕реНрдкреЗрд╕рд╢рд┐рдк рдСрдкрд░реЗрдЯрд░ рдХреЛ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ <рддреБрд▓рдирд╛> рд╣реЗрдбрд░ рдлрд╝рд╛рдЗрд▓ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдпрд╣ рдЙрди рд╣реЗрдбрд░ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреА рд╕реВрдЪреА рдореЗрдВ рдирд╣реАрдВ рдерд╛ рдЬреЛ рдХрд┐рд╕реА рднреА рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдкрд░ рдЙрдкрд▓рдмреНрдз рд╣реИрдВ (рдорд╛рдирдХ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рддрдерд╛рдХрдерд┐рдд
рдлреНрд░реАрд╕реНрдЯреИрдВрдбрд┐рдВрдЧ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЬреЛ рдХрд┐рд╕реА рднреА рд▓реЛрд╣реЗ рдкрд░ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ)ред
рдЕрдм рдпрд╣ рд╕реВрдЪреА рдореЗрдВ рд╣реИ :)
рдмрд╛рдХреА
рд╣рдорд╛рд░реА рдЕрдиреНрдп рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░, "C ++ 20 рдореЗрдВ рдирд╣реАрдВ" рдлреИрд╕рд▓рд╛ рдЬрд╛рд░реА рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛:
* рд╣рдо рдЪрд╛рд╣рддреЗ рдереЗ рдХрд┐ __func__ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреЙрдиреНрд╕реНрдЯреИрдХреНрд╕ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПред
* рд╣рдо рдЪрд╛рд╣рддреЗ рдереЗ рдХрд┐ рдЕрд╡рдзрд╛рд░рдгрд╛ рдЕрдкреВрд░реНрдг рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рди рдХрд░реЗрдВ, рдХреНрдпреЛрдВрдХрд┐ рдЕрдиреНрдпрдерд╛ рдЖрдкрдХреЛ рдХрдИ рдУрдбреАрдЖрд░ рдЙрд▓реНрд▓рдВрдШрди рдорд┐рд▓рддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдЯрд┐рдкреНрдкрдгреА рдХрд╛ рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рд╕рдХрд╛рд░рд╛рддреНрдордХ рдкреНрд░рднрд╛рд╡ рдкрдбрд╝рд╛: рдХрдВрдкрд╛рдЗрд▓рд░реНрд╕ рдЕрдм рдЪреЗрддрд╛рд╡рдиреА рдЬрд╛рд░реА рдХрд░рддреЗ рд╣реИрдВ рдпрджрд┐ рдЖрдк рдЖрд╡рд╢реНрдпрдХрддрд╛ рдореЗрдВ рдЕрдкреВрд░реНрдг рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред
* рд╣рдо std :: string рдХреЗ рд▓рд┐рдП рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдСрдкрд░реЗрдЯрд░ рдХреЛ рдареАрдХ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рдереЗ рддрд╛рдХрд┐ рдРрд╕реА рдЧрдбрд╝рдмрдбрд╝реА рди рд╣реЛ:
basic_string::operator=(charT c): double d = 3.14; std::string s; s = d;
рд╕рдорд┐рддрд┐ рдиреЗ C ++ 20 рдХреЗ рдмрд╛рдж рдПрдХ рдЕрд▓рдЧ рдкреЗрдкрд░ рд▓рд┐рдЦрдиреЗ рдФрд░ рдЗрд╕реЗ рд╕рд╣реА рдХрд░рдиреЗ рдХрд╛ рд╕реБрдЭрд╛рд╡ рджрд┐рдпрд╛ред
* рд╣рдо рдЕрд╕реНрдерд╛рдпреА рд▓рд╛рдЗрдиреЛрдВ рдХреЗ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдХреЛ std рдореЗрдВ рдорд╛рд░рдирд╛ рдЪрд╛рд╣рддреЗ рдереЗ :: string_view:
std::string foo(); std::string_view sv; sv = foo();
рдкрд░рд┐рдгрд╛рдо рдкрд┐рдЫрд▓реА рдЯрд┐рдкреНрдкрдгреА рдХреЗ рд╕рдорд╛рди рд╣реИ: рд╕рдорд┐рддрд┐ рдиреЗ рдПрдХ рдЕрд▓рдЧ рдкреЗрдкрд░ рд▓рд┐рдЦрдиреЗ рдФрд░ рд╕реА ++ 20 рдХреЗ рдмрд╛рдж рдЗрд╕реЗ рд╕рд╣реА рдХрд░рдиреЗ рдХрд╛ рд╕реБрдЭрд╛рд╡ рджрд┐рдпрд╛ред
* рд╣рдордиреЗ рдЕрдиреБрд░реЛрдз рдХрд┐рдпрд╛ рдХрд┐ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рд╕рдВрдХрд▓рд┐рдд рдХрд░реЗрдВ:
#include <type_traits> template <typename... Xs> auto f (Xs...) -> std::invoke_result_t<Xs...>;
рд╣рдореЗрдВ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ рдХрд┐ рд╕рдм рдХреБрдЫ рдЬрдЯрд┐рд▓ рд╣реИ, C ++ 20 рдХреА рдорд░рдореНрдордд рдХреЗ рд▓рд┐рдП рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рд░реВрдк рд╕реЗ рдХреЛрдИ рдореМрдХрд╛ рдирд╣реАрдВ рд╣реИред
рдЕрдиреНрдп рджреЗрд╢реЛрдВ рдХреА рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ
рдорд╣рддреНрд╡рдкреВрд░реНрдг рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдореЗрдВ: рдПрд╕рдЯреАрдбреА рдХреЗ рд▓рд┐рдП рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдЬреЛрдбрд╝рдирд╛ :: рдЙрди рдкреНрд░рдХрд╛рд░реЛрдВ рд╕реЗ рдЕрд╡рдзрд┐ рдЬреЛ рд░реЗрдВрдЬ рдХреА рдЕрд╡рдзрд╛рд░рдгрд╛ рдХреЛ рд╕рдВрддреБрд╖реНрдЯ рдХрд░рддреЗ рд╣реИрдВ :: contiguous_rangeред рддреЛ рдЕрдм рд╕реНрдкрд╛рди рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ std :: рд╡реЗрдХреНрдЯрд░ рдФрд░ std :: string рд╕реЗ рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд╣рдордиреЗ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ std :: string_view рдХреЛ рджреЛ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ рд╕реЗ рдЬреЛрдбрд╝рд╛ рд╣реИ рдЬреЛ рдХрд┐ рд╢реНрд░реЗрдгрд┐рдпреЛрдВ рдХреА рдЕрд╡рдзрд╛рд░рдгрд╛ рдХреЛ рд╕рдВрддреБрд╖реНрдЯ рдХрд░рддреЗ рд╣реИрдВ :: contiguous_iteratorред
рдордЬреЗрджрд╛рд░ рд╕рдВрдкрд╛рджрди <рддреБрд▓рдирд╛> рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░ рд░рд╣реЗ рдереЗред рдкрд┐рдЫрд▓реЗ рддреАрди рд╡рд░реНрд╖реЛрдВ рдореЗрдВ, рдСрдкрд░реЗрдЯрд░ <=> рдмрд╣реБрдд рдмрджрд▓ рдЧрдпрд╛ рд╣реИред рд╡рд╣ рдЕрдм рд╕рдорд╛рдирддрд╛ рдХреЗ рд▓рд┐рдП рддреБрд▓рдирд╛ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рд╣реИ, рдФрд░, рддрджрдиреБрд╕рд╛рд░, рд╕рд╛рдордЧреНрд░реА рдХреА рдПрдХ рддрд┐рд╣рд╛рдИ <рддреБрд▓рдирд╛> рдХреА рдЕрдм рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдХрдИ рджреЗрд╢реЛрдВ рдиреЗ рдЗрд╕ рдкрд░ рдзреНрдпрд╛рди рджрд┐рдпрд╛ рд╣реИ - рдЙрдиреНрд╣реЛрдВрдиреЗ рдорд╛рдирдХ рдХреЛ рдХрдо рдХрд░ рджрд┐рдпрд╛ рд╣реИред
рдЧреИрд░-рдкреНрд░рдХрд╛рд░ рдХреЗ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдорд╛рдкрджрдВрдбреЛрдВ рдореЗрдВ рдПрдХ рдорд╣рд╛рди рдкрд░рд┐рд╡рд░реНрддрди рдЪреБрдкрдХреЗ рд╕реЗред C ++ 20 рдореЗрдВ,
рдХрд┐рд╕реА рдХреЙрдиреНрд╕реНрдЯреНрд░реЗрдХреНрд╕ рд╡рд┐рдзреНрд╡рдВрд╕рдХ рдФрд░ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд╕рджрд╕реНрдпреЛрдВ рдХреЗ рд╕рд╛рде
рд▓рдЧрднрдЧ рдХрд┐рд╕реА рднреА рд╡рд░реНрдЧ (рджреЗрдЦреЗрдВ P1907) рдХреЛ рдкрд╛рд╕ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реЛрдЧрд╛, рднрд▓реЗ рд╣реА рдХрдХреНрд╖рд╛ рдореЗрдВ рдлрд╝реНрд▓реЛрдЯрд┐рдВрдЧ-рдкреЙрдЗрдВрдЯ рдкреНрд░рдХрд╛рд░ рдпрд╛ рд▓рд┐рдВрдХ рд╣реЛрдВред
рд╣рдордиреЗ рд▓рд╛рдкрддрд╛ рдХрд╛рд╕реНрдЯ рдХреЛ рдорд╛рдирдХ рдХреЗ рд╡рд┐рднрд┐рдиреНрди рд╣рд┐рд╕реНрд╕реЛрдВ рдореЗрдВ рднреА рдЬреЛрдбрд╝рд╛, рдХреБрдЫ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рддрд░реНрдХреЛрдВ рдХреЗ рдирд╛рдо рдФрд░ рдХреНрд░рдо рдХреЛ C ++ 20 рдореЗрдВ рдмрджрд▓ рджрд┐рдпрд╛ред рдЕрд╡рдзрд╛рд░рдгрд╛рдУрдВ рдФрд░ рд╢реНрд░реЗрдгрд┐рдпреЛрдВ, рдорд╛рдирдХ рдкрд╛рда рдХреЗ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдФрд░ рдЕрдиреНрдп рдЫреЛрдЯреА рдЪреАрдЬрд╝реЛрдВ рдХреЗ рд▓рд┐рдП рднреА рдХрдИ рд╕рдВрдкрд╛рджрди рд╣реИрдВред
рдирдВрдмрд░ рдЯреАрдПрд╕
ZaMaZaN4iK рдФрд░
рдореИрдВ C ++ рдиреНрдпреВрдореЗрд░рд┐рдХреНрд╕ рд╡рд░реНрдХ рдЗрди рдкреНрд░реЛрдЧреНрд░реЗрд╕ рдбреЙрдХреНрдпреВрдореЗрдВрдЯ рдХреЗ рд╕рд╛рде рдХрдореЗрдЯреА рдХреЛ
рдЖрдВрджреЛрд▓рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдереЗред рдЕрдм рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдУрд╡рд░рдлреНрд▓реЛ рдФрд░ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдЙрдкрдирд╛рдореЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд╣рд╛рдпрдХ рдирд┐рдореНрди-рд╕реНрддрд░реАрдп рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде-рд╕рд╛рде рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдирдИ рдкреНрд░рдХрд╛рд░ рдХреА рд╕рдВрдЦреНрдпрд╛рдУрдВ (wide_integer, рдкреВрд░реНрдгрд╛рдВрдХ, рддрд░реНрдХрд╕рдВрдЧрдд) рдХрд╛ рдПрдХ рд╕реЗрдЯ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП C ++ 23 рдХреЗ рд▓рд┐рдП рдиреЗрдкреЛрд▓рд┐рдпрди рдпреЛрдЬрдирд╛рдПрдВ рд╣реИрдВред
рдореБрдЭреЗ рдкреВрд░реА рд╕рдорд┐рддрд┐ рдХреЗ рд▓рд┐рдП рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреА рд╢реБрд░реВрдЖрдд рдХреЗ рд╕рд╛рде рдЕрдЧрд▓реА рдмреИрдардХ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░рд╕реНрддреБрддрд┐ рддреИрдпрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рд╛ рдЧрдпрд╛ рдерд╛ред
рдирд┐рд╖реНрдкрд╛рджрдХреЛрдВ
рдЕрднрд┐рдпреЛрдЬрдХ C ++ 23 рдХреА рдкреНрд░рд╛рдердорд┐рдХрддрд╛рдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИред рд╡реЗ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИрдВ, рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ (рдиреЗрдЯрд╡рд░реНрдХ, рдбрд┐рд╕реНрдХ, рдкреНрд░реЛрд╕реЗрд╕ ...) рдХреЗ рд▓рд┐рдП, рд╡реЗ рдХреЛрд░рдЯрд╛рдЗрди рд╢реЗрдбрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдЖрдзрд╛рд░ рд╣реИрдВ рдФрд░ рддреАрд╕рд░реЗ рдкрдХреНрд╖ рдХреЗ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХрд▓ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкреНрд░рджрд╛рди рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред
рдЙрд╕реА рд╕рдордп, рдирд┐рд╖реНрдкрд╛рджрдХреЛрдВ рдХреЛ рдЕрдкрдиреЗ рдЖрдВрддрд░рд┐рдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХрд╛ рдЕрдиреБрдХреВрд▓рди рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХреЛрдб рдХреЗ рд▓рд┐рдП:
template <std::input_range Range> void MySort(Range& data) { namespace stdr = std::ranges; std::sort(GetGlobalExecutor(), stdr::begin(data), stdr::end(data), 42); }
GetGlobalExecutor () рдлрд╝рдВрдХреНрд╢рди рд╡рд╛рдкрд╕ рдЖ рд╕рдХрддрд╛ рд╣реИ:
* рдПрдХрд▓-рдереНрд░реЗрдбреЗрдб рдирд┐рд╖реНрдкрд╛рджрдХ - рдЗрд╕реЗ рд╕рд╛рдорд╛рдиреНрдп std рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП :: рдЗрд╕рдХреЗ рдзрд╛рдЧреЗ рдкрд░ рдЫрд╛рдБрдЯреЗрдВ;
* рдорд▓реНрдЯреАрдереНрд░реЗрдбреЗрдб рдирд┐рд╖реНрдкрд╛рджрдХ - рдЗрд╕реЗ рд╕рдорд╛рдирд╛рдВрддрд░ рдЫрдВрдЯрд╛рдИ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП;
* рдЬреАрдкреАрдпреВ рдирд┐рд╖реНрдкрд╛рджрдХ - рдЗрд╕реЗ рд╡реАрдбрд┐рдпреЛ рдХрд╛рд░реНрдб рдХреА рдореЗрдореЛрд░реА рдореЗрдВ рдбреЗрдЯрд╛ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рд╡рд╣рд╛рдВ рдЗрд╕реЗ рд╕реЙрд░реНрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рдбреЗрдЯрд╛ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рд╣реЛрдЧрд╛;
* NUMA рдирд┐рд╖реНрдкрд╛рджрдХ - ...
* ...
рдЕрдм рддрдХ, рдРрд╕реА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдбрд░рд╛рд╡рдиреЗ рдЕрдиреБрдХреВрд▓рди рдмрд┐рдВрджреБ рдСрдмреНрдЬреЗрдХреНрдЯ (CPO) рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдкреНрд░рддреНрдпреЗрдХ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЛ рдЙрдирдореЗрдВ рдмрджрд▓ рджреЗрдВред рд╕рдорд┐рддрд┐ рдХреЛ рдпрд╣ рдкрд╕рдВрдж рдирд╣реАрдВ рдЖрдпрд╛ ...
рд▓реЗрдХрд┐рди рдХрдо рд╕реЗ рдХрдо рдЙрдиреНрд╣реЛрдВрдиреЗ
P0443 рдХреЛ рдордВрдЬреВрд░реА рджреЗ рджреА - рдореВрд▓ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ред рдирд┐рд╖реНрдкрд╛рджрдХреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рднреА рдмрд╛рдж рдХреЗ рд╡рд╛рдХреНрдпреЛрдВ рдХреЛ P0443 рдХреЗ рд▓рд┐рдП рдкреИрдЪ рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛ред
рдмрдЬрд╛рдп рдпреЛрдЧ рдХреЗ
рдЕрдм рд╣рдо C ++ 20 рд╕реЗ рд╕рд┐рд░реНрдл рдПрдХ рд╕рдорд┐рддрд┐ рдХреА рдмреИрдардХ рд╕реЗ рдЕрд▓рдЧ рд╣реЛ рдЧрдП рд╣реИрдВред рдмрд╕ рдереЛрдбрд╝рд╛ рд╕рд╛ рдмрдЪрд╛ рд╣реИ ...
рдЦреИрд░, рд╣рд░ рдХреЛрдИ рдЬреЛ рд╕рдорд┐рддрд┐ рдХреЗ рдкреНрд░рддрд┐рдирд┐рдзрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдЪреИрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ - рдорд┐рдЯреИрдкреНрд╕ рдФрд░ рд╕реА ++ рд╕рдореНрдореЗрд▓рди
(*) рджреЗрдЦреЗрдВ :
*
рдорд┐рдиреНрд╕реНрдХ рдореЗрдВ рдХреЛрд░рд╣рд╛рд░реНрдб*
C ++ рд╕рд╛рдЗрдмреЗрд░рд┐рдпрд╛ 2020*
рд╕реА ++ рд░реВрд╕ 2020*
рд╕реЗрдВрдЯ рдкреАрдЯрд░реНрд╕рдмрд░реНрдЧ рд╕реА ++ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕рдореВрд╣*
C ++ рдореАрдЯрдЕрдк 2019 рдорд╛рд╕реНрдХреЛ рдореЗрдВ(*) рдЬреАрд╡рди рд╣реИрдХ: рдпрджрд┐ рдЖрдк рдПрдХ рд╡рдХреНрддрд╛ рд╣реИрдВ рддреЛ рдЖрдкрдХреЛ рд╕рдореНрдореЗрд▓рди рдЯрд┐рдХрдЯ рдХреЗ рд▓рд┐рдП рднреБрдЧрддрд╛рди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред