рдЕрд╡рдзрд╛рд░рдгрд╛рдУрдВ рдХреА рдкрд╣рд▓реА рдЫрд╛рдк



рдореИрдВрдиреЗ рдирдИ C ++ 20 рд╕реБрд╡рд┐рдзрд╛ - рдЕрд╡рдзрд╛рд░рдгрд╛рдУрдВ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред

рдЕрд╡рдзрд╛рд░рдгрд╛рдУрдВ (рдпрд╛ рдЕрд╡рдзрд╛рд░рдгрд╛рдУрдВ , рдЬреИрд╕рд╛ рдХрд┐ рд░реВрд╕реА рднрд╛рд╖реА рд╡рд┐рдХреА рд▓рд┐рдЦрддреЗ рд╣реИрдВ) рдПрдХ рдмрд╣реБрдд рд╣реА рд░реЛрдЪрдХ рдФрд░ рдЙрдкрдпреЛрдЧреА рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИ рдЬреЛ рд▓рдВрдмреЗ рд╕рдордп рд╕реЗ рдХрдореА рд░рд╣реА рд╣реИред

рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ, рдпрд╣ рдЯреЗрдореНрдкрд▓реЗрдЯ рддрд░реНрдХреЛрдВ рдХреЗ рд▓рд┐рдП рдЯрд╛рдЗрдк рдХрд░ рд░рд╣рд╛ рд╣реИред

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

рдЕрд╡рдзрд╛рд░рдгрд╛рдУрдВ рдХреЛ рдЗрд╕ рдЧрд▓рддрдлрд╣рдореА рдХреЛ рдареАрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рд╡реЗ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдореЗрдВ рдПрдХ рдЯрд╛рдЗрдкрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рдФрд░ рдпрд╣ рдмрд╣реБрдд рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рд╣реИред рдФрд░ рдЕрдм, рдЗрд╕ рдкреНрд░рдгрд╛рд▓реА рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЛ рд╕рдордЭрддреЗ рд╣реБрдП, рдореИрдВрдиреЗ рдЗрдВрдЯрд░рдиреЗрдЯ рдкрд░ рдЙрдкрд▓рдмреНрдз рд╕рд╛рдордЧреНрд░рд┐рдпреЛрдВ рдХрд╛ рдЕрдзреНрдпрдпрди рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд┐рдпрд╛ред

рд╕рдЪ рдХрд╣реВрдБ рддреЛ, рдореИрдВ рдереЛрдбрд╝рд╛ рд╣реИрд░рд╛рди рд╣реВрдБ :) C ++ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЬрдЯрд┐рд▓ рднрд╛рд╖рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХрдо рд╕реЗ рдХрдо рдПрдХ рдмрд╣рд╛рдирд╛ рд╣реИ: рдРрд╕рд╛ рд╣реБрдЖред рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдкрд░ рдореЗрдЯрд╛рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХреА рдЦреЛрдЬ рдХреА рдЧрдИ рдереА, рди рдХрд┐ рдХрд┐рд╕реА рднрд╛рд╖рд╛ рдХреЛ рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд░рддреЗ рд╕рдордпред рдФрд░ рдлрд┐рд░, рднрд╛рд╖рд╛ рдХреЗ рдЕрдЧрд▓реЗ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЛ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рддреЗ рд╕рдордп, рдЙрдиреНрд╣реЗрдВ рдЗрд╕ "рдЦреЛрдЬ" рдХреЗ рдЕрдиреБрдХреВрд▓ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдХреНрдпреЛрдВрдХрд┐ рджреБрдирд┐рдпрд╛ рдореЗрдВ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдХреЛрдб рд▓рд┐рдЦреЗ рдЧрдП рдереЗред рдЕрд╡рдзрд╛рд░рдгрд╛рдПрдВ рдПрдХ рдирдпрд╛ рдЕрд╡рд╕рд░ рд╣реИред рдФрд░, рдпрд╣ рдореБрдЭреЗ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ, рдЙрдирдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рдХреБрдЫ рдЕрд╕реНрдкрд╖реНрдЯрддрд╛ рдкрд╣рд▓реЗ рд╕реЗ рдореМрдЬреВрдж рд╣реИред рд╢рд╛рдпрдж рдпрд╣ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓реА рдХреНрд╖рдорддрд╛рдУрдВ рдХреА рдмрдбрд╝реА рдорд╛рддреНрд░рд╛ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХрд╛ рдкрд░рд┐рдгрд╛рдо рд╣реИ? рдЖрдЗрдП рдЬрд╛рдирдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВ ...

рд╕рд╛рдорд╛рдиреНрдп рдЬрд╛рдирдХрд╛рд░реА


рдПрдХ рдЕрд╡рдзрд╛рд░рдгрд╛ рдЯреЗрдореНрдкрд▓реЗрдЯ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рдПрдХ рдирдИ рднрд╛рд╖рд╛ рдЗрдХрд╛рдИ рд╣реИред рдПрдХ рдЕрд╡рдзрд╛рд░рдгрд╛ рдХрд╛ рдПрдХ рдирд╛рдо, рдкреИрд░рд╛рдореАрдЯрд░ рдФрд░ рдПрдХ рдирд┐рдХрд╛рдп рд╣реИ - рдПрдХ рд╡рд┐рдзреЗрдп рдЬреЛ рдПрдХ рдирд┐рд░рдВрддрд░рддрд╛ рджреЗрддрд╛ рд╣реИ (рдпрд╛рдиреА, рд╕рдВрдХрд▓рди рдЪрд░рдг рдореЗрдВ рдЧрдгрдирд╛ рдХреА рдЬрд╛рддреА рд╣реИ) рдЕрд╡рдзрд╛рд░рдгрд╛ рдХреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рддрд╛рд░реНрдХрд┐рдХ рдореВрд▓реНрдпред рдРрд╢реЗ рд╣реА:

template<int I> 
concept Even = I % 2 == 0;  

template<typename T>
concept FourByte = sizeof(T)==4;

рддрдХрдиреАрдХреА рд░реВрдк рд╕реЗ, рдЕрд╡рдзрд╛рд░рдгрд╛рдПрдВ рдмреВрд▓ рдХреА рддрд░рд╣ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдХреЙрдиреНрд╕реНрдЯреНрд░реЗрдХреНрд╕ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХреЗ рд╕рдорд╛рди рд╣реИрдВ:

template<int I>
constexpr bool EvenX = I % 2 == 0; 

template<typename T>
constexpr bool FourByteX = sizeof(T)==4;

рдЖрдк рд╕рд╛рдорд╛рдиреНрдп рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдореЗрдВ рднреА рдЕрд╡рдзрд╛рд░рдгрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

bool b1 = Even<2>; 

рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП


рдЕрд╡рдзрд╛рд░рдгрд╛рдУрдВ рдХрд╛ рдореБрдЦреНрдп рд╡рд┐рдЪрд╛рд░ рдпрд╣ рд╣реИ рдХрд┐ рдЗрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдЯрд╛рдЗрдкрдиреЗрдо рдпрд╛ рдХреНрд▓рд╛рд╕ рдХреАрд╡рд░реНрдб рдХреЗ рдмрдЬрд╛рдп рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЬреИрд╕реЗ рдореЗрдЯреИрдЯрд┐рдк ("рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреНрд░рдХрд╛рд░")ред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╕реНрдерд┐рд░ рдЯрд╛рдЗрдкрд┐рдВрдЧ рдХреЛ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдореЗрдВ рдкреЗрд╢ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

template<FourByte T>
void foo(T const & t) {}

рдЕрдм, рдЕрдЧрд░ рд╣рдо int рдХреЛ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЕрдзрд┐рдХрд╛рдВрд╢ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдХреЛрдб рд╕рдВрдХрд▓рди рдХрд░реЗрдЧрд╛; рдФрд░ рдпрджрд┐ рдбрдмрд▓ рд╣реИ, рддреЛ рдПрдХ рдЫреЛрдЯреА рдФрд░ рд╕рдордЭрдиреЗ рдпреЛрдЧреНрдп рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рдЬрд╛рд░реА рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЯреЗрдореНрдкрд▓реЗрдЯреНрд╕ рдХрд╛ рд╕рд░рд▓ рдФрд░ рд╕реНрдкрд╖реНрдЯ рдЯрд╛рдЗрдкрд┐рдВрдЧ, рдЕрдм рддрдХ рд╕рдм рдХреБрдЫ рдареАрдХ рд╣реИред

рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ


рдпрд╣ рджреЛрд╣рд░реЗ рдЙрджреНрджреЗрд╢реНрдп рдХреЗ рд╕рд╛рде рдПрдХ рдирдпрд╛ "рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ" C ++ 20 рдХреАрд╡рд░реНрдб рд╣реИ: рдЗрд╕рдореЗрдВ рдХреНрд▓реЙрдЬ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдФрд░ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдЬреИрд╕рд╛ рдХрд┐ рдмрд╛рдж рдореЗрдВ рджрд┐рдЦрд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдпрд╣ рдЕрдЬреАрдм рдХреАрд╡рд░реНрдб рдмрдЪрдд рдХреБрдЫ рднреНрд░рдо рдХреА рдУрд░ рд▓реЗ рдЬрд╛рддреА рд╣реИред

рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ


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

рдпрджрд┐ рдХреЛрдб рд╕рд╣реА рд╣реИ - рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╕рд╣реА рд╣реИ, рдЕрдиреНрдпрдерд╛ рдЧрд▓рдд рд╣реИред рдХреЛрдб рд╣реА, рдЬрд╝рд╛рд╣рд┐рд░ рд╣реИ, рдХреЛрдб рдкреАрдврд╝реА рдореЗрдВ рдХрднреА рдирд╣реАрдВ рдорд┐рд▓рддрд╛ рд╣реИ, рдмрд╣реБрдд рдЖрдХрд╛рд░ рдпрд╛ рдШреЛрд╖рдгрд╛ рдореЗрдВ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреА рддрд░рд╣ред

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

bool b = requires { 3.14 >> 1; };

рдФрд░ рдЯреЗрдореНрдкрд▓реЗрдЯ рдореЗрдВ - рдХреГрдкрдпрд╛:

template<typename T>
constexpr bool Shiftable = requires(T i) { i>>1; };

рдФрд░ рдпрд╣ рдХрд╛рдо рдХрд░реЗрдЧрд╛:

bool b1 = Shiftable<int>; // true
bool b2 = Shiftable<double>; // false

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

template <typename T>
concept Machine = 
  requires(T m) {  //   `m` ,   Machine
	m.start();     //    `m.start()` 
	m.stop();      //   `m.stop()`
};  

рд╡реИрд╕реЗ, рдкрд░реАрдХреНрд╖рдг рдХреЛрдб (рди рдХреЗрд╡рд▓ рдЯреЗрдореНрдкрд▓реЗрдЯ рдкреИрд░рд╛рдореАрдЯрд░) рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ рд╕рднреА рдЪрд░ рдХреЛ рдХреЛрд╖реНрдардХ рдореЗрдВ рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдХрд┐рд╕реА рдХрд╛рд░рдг рд╕реЗ, рдПрдХ рдЪрд░ рдШреЛрд╖рд┐рдд рдХрд░рдирд╛ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИред

рдЕрдВрджрд░ рдХреА рдЬрд╛рдБрдЪ рдкреНрд░рдХрд╛рд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ


рдпрд╣ рд╡рд╣ рдЬрдЧрд╣ рд╣реИ рдЬрд╣рд╛рдВ рдХреЛрдб рдФрд░ рдорд╛рдирдХ C ++ рдХреЗ рдмреАрдЪ рдЕрдВрддрд░ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИред рд▓реМрдЯреЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреА рдЬрд╛рдБрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдХ рд╡рд┐рд╢реЗрд╖ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ: рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдШреБрдВрдШрд░рд╛рд▓реЗ рдХреЛрд╖реНрдардХ рдореЗрдВ рд▓рд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдПрдХ рддреАрд░ рд░рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдЗрд╕рдХреЗ рдмрд╛рдж, рдПрдХ рдЕрд╡рдзрд╛рд░рдгрд╛ рд▓рд┐рдЦреА рдЬрд╛рддреА рд╣реИ рдХрд┐ рдкреНрд░рдХрд╛рд░ рдХреЛ рд╕рдВрддреБрд╖реНрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╕реАрдзреЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рд╣реИред

рдЬрд╛рдВрдЪреЗрдВ рдХрд┐ рдлрд╝рдВрдХреНрд╢рди рдХреА рд╡рд╛рдкрд╕реА рдХреЛ int рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

requires(T v, int i) {
  { v.f(i) } -> std::convertible_to<int>;
}  

рдЬрд╛рдБрдЪреЗрдВ рдХрд┐ рд░рд┐рдЯрд░реНрди рдлрдВрдХреНрд╢рди рдмрд┐рд▓реНрдХреБрд▓ int рд╣реИ:

requires(T v, int i) {
  { v.f(i) } -> std::same_as<int>; 
}  

(std :: same_as рдФрд░ std :: convertible_to рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╕реЗ рдЕрд╡рдзрд╛рд░рдгрд╛рдПрдБ рд╣реИрдВ)ред

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

рдЕрдВрджрд░ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ


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

requires { 
  expression;         // expression is valid
  requires predicate; // predicate is true
};

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╡рд┐рдзреЗрдп рдХреЗ рд░реВрдк рдореЗрдВ, рдкрд╣рд▓реЗ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдЕрд╡рдзрд╛рд░рдгрд╛рдУрдВ рдпрд╛ рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рдХреНрд╖рдгреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг:

requires(Iter it) {
  //     (   Iter   *  ++)
  *it++;
 
  //    -  
  requires std::convertible_to<decltype(*it++), typename Iter::value_type>;
 
  //    -  
  requires std::is_convertible_v<decltype(*it++), typename Iter::value_type>;
}

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

requires (T v) { 
  requires (typename T::value_type x) { ++x; }; //     , 
												//     !
};  

рдЗрд╕рд▓рд┐рдП, рдбрдмрд▓ рдХреЗ рд╕рд╛рде рдПрдХ рдЕрдЬреАрдм рд░реВрдк рдЙрддреНрдкрдиреНрди рд╣реБрдЖ:

requires (T v) { 
  requires requires (typename T::value_type x) { ++x; }; //       "++x"
};  

рдпрд╣рд╛рдБ "рдЖрд╡рд╢реНрдпрдХрддрд╛" рд╕реЗ рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рдордЬреЗрджрд╛рд░ рднрд╛рдЧрдиреЗ рдХрд╛ рдХреНрд░рдо рд╣реИред

рд╡реИрд╕реЗ, рджреЛ рдХрд╛ рдПрдХ рдФрд░ рд╕рдВрдпреЛрдЬрди рдЗрд╕ рд╕рдордп рдЦрдВрдб (рдиреАрдЪреЗ рджреЗрдЦреЗрдВ) рдФрд░ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:

template <typename T>
  requires requires(T x, T y) { bool(x < y); }
bool equivalent(T const& x, T const& y)
{
  return !(x < y) && !(y < x);
};

рдЦрдВрдб рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ


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

//  require
template<typename Cont>
	requires Sortable<Cont>
void sort(Cont& container);

//   require (  )
template<typename Cont>
void sort(Cont& container) requires Sortable<Cont>;

//    typename
template<Sortable Cont>
void sort(Cont& container)  

рдШреЛрд╖рдгрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рддрд╛рд░реНрдХрд┐рдХ рдСрдкрд░реЗрдЯрд░реЛрдВ рджреНрд╡рд╛рд░рд╛ рд╕рдВрдпреБрдХреНрдд рдХрдИ рд╡рд┐рдзреЗрдпрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреА рд╣реИред

template <typename T>
  requires is_standard_layout_v<T> && is_trivial_v<T>
void fun(T v); 
 
int main()
{
  std::string s;
 
  fun(1);  // ok
  fun(s);  // compiler error
}

рд╣рд╛рд▓рд╛рдБрдХрд┐, рд╕рдВрдХрд▓рди рдХреА рддреНрд░реБрдЯрд┐ рд╣реЛрдиреЗ рдкрд░, рдмрд╕ рдПрдХ рд╣реА рд╕реНрдерд┐рддрд┐ рдХреЛ рдЙрд▓реНрдЯрд╛ рдХрд░ рджреЗрдВ:

template <typename T>
  requires is_standard_layout_v<T> && !is_trivial_v<T>
void fun(T v); 

рдпрд╣рд╛рдБ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ рдЬреЛ рдпрд╛ рддреЛ рд╕рдВрдХрд▓рди рдирд╣реАрдВ рдХрд░реЗрдЧрд╛

template <typename T>
  requires !is_trivial_v<T>
void fun(T v);	

рдЗрд╕рдХрд╛ рдХрд╛рд░рдг рдЕрд╕реНрдкрд╖реНрдЯрддрд╛рдПрдВ рд╣реИрдВ рдЬреЛ рдХреБрдЫ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рддреЗ рд╕рдордп рдЙрддреНрдкрдиреНрди рд╣реЛрддреА рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдРрд╕реЗ рдЯреЗрдореНрдкрд▓реЗрдЯ рдореЗрдВ:

template <typename T> 
  requires (bool)&T::operator short unsigned int foo();

рдпрд╣ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЕрд╣рд╕реНрддрд╛рдХреНрд╖рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреНрдпрд╛ рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИ - рд╕рдВрдЪрд╛рд▓рдХ рдпрд╛ рдлреВ () рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдкред рдЗрд╕рд▓рд┐рдП, рдбреЗрд╡рд▓рдкрд░реНрд╕ рдиреЗ рддрдп рдХрд┐рдпрд╛ рдХрд┐ рдмрд┐рдирд╛ рдХреЛрд╖реНрдардХ рдХреЗ, рдХреНрдпреЛрдВрдХрд┐ рддрд░реНрдХ рдХреЗ рд▓рд┐рдП рдХреНрд▓реЙрдЬ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдХреЗрд╡рд▓ рдмрд╣реБрдд рд╕реАрдорд┐рдд рд╕рдВрд╕реНрдерд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ - рд╕рд╣реА рдпрд╛ рдЧрд▓рдд рд╢рд╛рдмреНрджрд┐рдХ, рдлреЙрд░реНрдо рдореВрд▓реНрдп рдХреЗ рдкреНрд░рдХрд╛рд░ рдмреВрд▓ рдХреЗ рдХреНрд╖реЗрддреНрд░ рдХреЗ рдирд╛рдо, рдорд╛рди, рдЯреА :: рдорд╛рди, рдПрдирдПрд╕: рдЯреНрд░рд┐рдЯ :: рдорд╛рди, рдХреЙрдиреНрд╕реЗрдкреНрдЯ рдЯрд╛рдЗрдк рдХреЗ рдирд╛рдо рдХреЙрдиреНрд╕реЗрдкреНрдЯ рдФрд░ рдПрдХреНрд╕рдкреНрд░реЗрд╢рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдХреЛрд╖реНрдардХ рдореЗрдВ рдмрд╛рдХреА рд╕рдм рдХреБрдЫ рд╕рдВрд▓рдЧреНрди рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП:

template <typename T>
  requires (!is_trivial_v<T>)
void fun(T v);

рдЕрдм рдЖрд╡рд╢реНрдпрдХ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрд▓реЙрдЬрд╝ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ


рдПрдХ рдЕрдиреНрдп рдЙрджрд╛рд╣рд░рдг рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред

template <typename T>
  requires is_trivial_v<typename T::value_type> 
void fun(T v); 

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

template <typename T>
  requires is_trivial_v<typename T::value_type> 
void fun(T v) { std::cout << "1"; } 
 
template <typename T>
void fun(T v) { std::cout << "2"; } 
 
int main()
{
  fun(1);  // displays: "2"
}

рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдХреЛ рди рдХреЗрд╡рд▓ рддрдм рддреНрдпрд╛рдЧ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрдм рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдЖрд╡рд╢реНрдпрдХ рд╡рд┐рдзреЗрдп рд░рд┐рдЯрд░реНрди рдЧрд▓рдд рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рдмрд▓реНрдХрд┐ рдпрд╣ рднреА рдЧрд▓рдд рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред

рд╡рд┐рдзреЗрдп рдХреЗ рдЖрд╕-рдкрд╛рд╕ рдХреЗ рдХреЛрд╖реНрдардХ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЕрдиреБрд╕реНрдорд╛рд░рдХ рд╣реИрдВ, рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдХрд┐ рд╡рд┐рдзреЗрдп рдХреЗ рд╡реНрдпреБрддреНрдХреНрд░рдо рдореЗрдВ рд╡рд┐рдзреЗрдп рдХреЗ рд╡рд┐рдкрд░реАрдд рдирд╣реАрдВ рд╣реИред рдЗрд╕рд▓рд┐рдП,

requires is_trivial_v<typename T::value_type> 

рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдирд┐рд╢рд╛рди рд╕рд╣реА рд╣реИ рдФрд░ рд╕рд╣реА рд╣реИред рдЬрд┐рд╕рдореЗрдВ

!is_trivial_v<typename T::value_type> 

рдХрд╛ рдЕрд░реНрде рд╣реЛрдЧрд╛ "рдЧреБрдг рд╕рд╣реА рд╣реИ рдФрд░ рдЧрд▓рдд рд╣реИ"
рдкреНрд░рдердо рд╡рд┐рдзреЗрдп рдХрд╛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рддрд╛рд░реНрдХрд┐рдХ рд╡реНрдпреБрддреНрдХреНрд░рдо рдирд╣реАрдВ рд╣реИ ("рдЧреБрдг рд╕рд╣реА рд╣реИ рдФрд░ рд╕рд╣реА рд▓реМрдЯрд╛рддрд╛ рд╣реИ") == "рдЧреБрдг рд╕реНрдкрд╖реНрдЯ рд╣реИ рдпрд╛ рдЧрд▓рдд рд╣реИ" - рдпрд╣ рдЕрд╡рдзрд╛рд░рдгрд╛ рдХреА рдПрдХ рд╕реНрдкрд╖реНрдЯ рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдереЛрдбрд╝рд╛ рдФрд░ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рддрд░реАрдХреЗ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:

template <typename T>
concept value_type_valid_and_trivial 
  = is_trivial_v<typename T::value_type>; 
 
template <typename T>
  requires (!value_type_valid_and_trivial<T>)
void fun(T v); 

рд╕рдВрдпреЛрдЬрди рдФрд░ рд╡рд┐рдШрдЯрди


рддрд╛рд░реНрдХрд┐рдХ рд╕рдВрдпреЛрдЬрди рдФрд░ рд╡рд┐рдШрдЯрди рдСрдкрд░реЗрдЯрд░ рд╣рдореЗрд╢рд╛ рдХреА рддрд░рд╣ рджрд┐рдЦрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рд╛рдорд╛рдиреНрдп рд╕реА ++ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдереЛрдбрд╝рд╛ рдЕрд▓рдЧ рддрд░реАрдХреЗ рд╕реЗ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред

рджреЛ рдмрд╣реБрдд рд╕рдорд╛рди рдХреЛрдб рд╕реНрдирд┐рдкреЗрдЯ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред

рдкрд╣рд▓реЗ рдХреЛрд╖реНрдардХ рдХреЗ рдмрд┐рдирд╛ рдПрдХ рд╡рд┐рдзреЗрдп рд╣реИ:

template <typename T, typename U>
  requires std::is_trivial_v<typename T::value_type>
		|| std::is_trivial_v<typename U::value_type>
void fun(T v, U u); 

рджреВрд╕рд░рд╛ рдХреЛрд╖реНрдардХ рдХреЗ рд╕рд╛рде рд╣реИ:

template <typename T, typename U>
  requires (std::is_trivial_v<typename T::value_type>
		 || std::is_trivial_v<typename U::value_type>)
void fun(T v, U u); 

рдЕрдВрддрд░ рдХреЗрд╡рд▓ рдХреЛрд╖реНрдардХ рдореЗрдВ рд╣реИред рд▓реЗрдХрд┐рди рдЗрд╕ рд╡рдЬрд╣ рд╕реЗ, рджреВрд╕рд░реЗ рдЯреЗрдореНрдкрд▓реЗрдЯ рдореЗрдВ, "рдЖрд╡рд╢реНрдпрдХрддрд╛-рдЦрдВрдб" рджреНрд╡рд╛рд░рд╛ рдПрдХрдЬреБрдЯ рджреЛ рдмрд╛рдзрд╛рдПрдВ рдирд╣реАрдВ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рддрд╛рд░реНрдХрд┐рдХ рдпрд╛ рджреНрд╡рд╛рд░рд╛ рдПрдХрдЬреБрдЯред

рдпрд╣ рдЕрдВрддрд░ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИред рдХреЛрдб рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ

std::optional<int> oi {};
int i {};
fun(i, oi);

рдпрд╣рд╛рдБ рдЯреЗрдореНрдкрд▓реЗрдЯ int рдФрд░ std :: рд╡реИрдХрд▓реНрдкрд┐рдХ рдХреЗ рджреНрд╡рд╛рд░рд╛ рддреНрд╡рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдкрд╣рд▓реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, int :: value_type рдкреНрд░рдХрд╛рд░ рдЕрдорд╛рдиреНрдп рд╣реИ, рдФрд░ рдкрд╣рд▓реА рд╕реАрдорд╛ рдЬрд┐рд╕рд╕реЗ рд╕рдВрддреБрд╖реНрдЯ рдирд╣реАрдВ рд╣реИред

рд▓реЗрдХрд┐рди рд╡реИрдХрд▓реНрдкрд┐рдХ рдкреНрд░рдХрд╛рд░ :: value_type рд╡реИрдз рд╣реИ, рджреВрд╕рд░рд╛ рдЧреБрдг рд╕рд╣реА рд╣реИ, рдФрд░ рдЪреВрдВрдХрд┐ рдмрд╛рдзрд╛рдУрдВ рдХреЗ рдмреАрдЪ рдПрдХ OR рдСрдкрд░реЗрдЯрд░ рд╣реИ, рд╕рдВрдкреВрд░реНрдг рд╡рд┐рдзреЗрдп рд╕рдВрдкреВрд░реНрдг рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдВрддреБрд╖реНрдЯ рд╣реИред

рджреВрд╕рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ рдПрдХ рдПрдХрд▓ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдПрдХ рдЕрдорд╛рдиреНрдп рдкреНрд░рдХрд╛рд░ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдХрд╛рд░рдг рдпрд╣ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдЕрдорд╛рдиреНрдп рд╣реИ рдФрд░ рд╡рд┐рдзреЗрдп рд╕рдВрддреБрд╖реНрдЯ рдирд╣реАрдВ рд╣реИред рддреЛ рд╕рд╛рдзрд╛рд░рдг рдХреЛрд╖реНрдардХ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЬреЛ рд╣реЛ рд░рд╣рд╛ рд╣реИ рдЙрд╕рдХрд╛ рдЕрд░реНрде рдмрджрд▓ рджреЗрддреЗ рд╣реИрдВред

рдирд┐рд╖реНрдХрд░реНрд╖ рдХреЗ рддреМрд░ рдкрд░


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

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

рдЕрд╡рдзрд╛рд░рдгрд╛рдУрдВ рдХреЛ "рд╕рд╣реА / рдЧрд▓рдд" рдФрд░ "рд╕рдВрдХрд▓рди / рд╕рдВрдХрд▓рд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ" рдХрд╛ рдПрдХ рд╣реА рдвреЗрд░ рдореЗрдВ рдорд┐рд╢реНрд░рдг, рдФрд░ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдХреЛрд╖реНрдардХ рдХреЗ рд╕рд╛рде рдЪреБрдЯрдХреБрд▓реЗ рднреА рдЧрд▓рдд рд╣реИрдВред рдпреЗ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЕрд╡рдзрд╛рд░рдгрд╛рдПрдВ рд╣реИрдВ, рдФрд░ рдЙрдиреНрд╣реЗрдВ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╕рдВрджрд░реНрднреЛрдВ рдореЗрдВ рдХрдбрд╝рд╛рдИ рд╕реЗ рдореМрдЬреВрдж рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП (рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореИрдВ рд╕рдордЭрддрд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рдХрд╣рд╛рдВ рд╕реЗ рдЖрдпрд╛ рд╣реИ - SFINAE рдирд┐рдпрдо рд╕реЗ, рдЬрд╣рд╛рдВ рдЕрд╕рдореНрдмрджреНрдз рдХреЛрдб рд╕рд┐рд░реНрдл рдЪреБрдкрдЪрд╛рдк рд╡рд┐рдЪрд╛рд░ рд╕реЗ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдХреЛ рдмрд╛рд╣рд░ рдХрд░ рджреЗрддрд╛ рд╣реИ)ред рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдЕрд╡рдзрд╛рд░рдгрд╛рдУрдВ рдХрд╛ рд▓рдХреНрд╖реНрдп рдХреЛрдб рдХреЛ рдпрдерд╛рд╕рдВрднрд╡ рд╕реНрдкрд╖реНрдЯ рдХрд░рдирд╛ рд╣реИ, рддреЛ рдХреНрдпрд╛ рдЗрди рд╕рднреА рдирд┐рд╣рд┐рдд рдЪреАрдЬреЛрдВ рдХреЛ рдирдИ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдореЗрдВ рдЦреАрдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕рдХреЗ рд▓рд╛рдпрдХ рдерд╛?

рд▓реЗрдЦ рдореБрдЦреНрдп рд░реВрдк рд╕реЗ
akrzemi1.wordpress.com/2020/01/29/requires-expression
akrzemi1.wordpress.com/2020/03/26/requires-clause
(рдмрд╣реБрдд рдЕрдзрд┐рдХ рдЙрджрд╛рд╣рд░рдг рдФрд░ рд░реЛрдЪрдХ рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ рд╣реИрдВ) рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ (
рдореЗрд░реЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдФрд░ рджрд┐рд▓рдЪрд╕реНрдк рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рд╕реЗ) рдЕрдиреНрдп рд╕реНрд░реЛрддреЛрдВ,
рд╕рднреА рдЙрджрд╛рд╣рд░рдгреЛрдВ рдкрд░ рдЬрд╛рдБрдЪ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИwandbox.org

All Articles