1. рдореЗрдпрд░реНрд╕ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ "рдкреНрд░рднрд╛рд╡реА рдФрд░ рдЖрдзреБрдирд┐рдХ рд╕реА ++" - рдЯреЗрдореНрдкрд▓реЗрдЯ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдирд┐рд╖реНрдХрд░реНрд╖

рд╢реБрдн рджреЛрдкрд╣рд░, рдкреНрд░рд┐рдп рдкрд╛рдардХ!


рдпрд╣ рд▓реЗрдЦ рдЕрдореВрд░реНрдд рд▓реЗрдЦреЛрдВ рдХреА рдПрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдореЗрдВ рдкрд╣рд▓рд╛ рд╣реИ рдЬрд┐рд╕реЗ рдореИрдВ рд╕реНрдХреЙрдЯ рдореЗрдпрд░реНрд╕ рдХреА рдкреБрд╕реНрддрдХ, рдЗрдлреЗрдХреНрдЯрд┐рд╡ рдФрд░ рдореЙрдбрд░реНрди c ++ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкрдврд╝реВрдВрдЧрд╛ред рдЗрди рд▓реЗрдЦреЛрдВ рдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдореЗрдВ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ github.com рдкрд░ рд╡рд░реНрдгрд┐рдд рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдПрдХ рдЕрд▓рдЧ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рд╣реЛрдЧреА рдЬрд┐рд╕рдореЗрдВ рд╡рд░реНрдгрд┐рдд рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдФрд░ рддрдХрдиреАрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред


рдЦрд╛рдХрд╛ рдкреНрд░рдХрд╛рд░ рдЖрд╡рд┐рд╖реНрдХрд╛рд░


рд╕рдлрд▓ рдбрд┐рдЬрд╛рдЗрди рддрдм рд╣реЛрддрд╛ рд╣реИ рдЬрдм рдЙрдкрднреЛрдХреНрддрд╛ рдХреЛ рдпрд╣ рдирд╣реАрдВ рдкрддрд╛ рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рдЙрдкрдХрд░рдг рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╕рдм рдХреБрдЫ рдЙрд╕рдХреЗ рдЕрдиреБрд░реВрдк рд╣реИред


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


рдореЗрдпрд░реНрд╕ рдкреНрд░рдХрд╛рд░ - "рдЯреА" рдХреЛ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛрддрд╛ рд╣реИ рдФрд░ рдкреНрд░рдХрд╛рд░ - "рдкреИрд░рд╛рдореИрдкреНрдЯрд╛рдЗрдк" , рдЬреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рджреНрд╡рд╛рд░рд╛ рдкреИрд░рд╛рдореАрдЯрд░ рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдореЗрдВ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред


1. рдкреИрд░рд╛рдореАрдЯрд░ рджреГрд╢реНрдп - рд▓рд┐рдВрдХ рдпрд╛ рдкреЙрдЗрдВрдЯрд░


рд╡реНрдпреБрддреНрдкрдиреНрди рдирд┐рдпрдо рдХреЛ рдЬрд▓реНрджреА рд╕реЗ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдЗрд╕реЗ рдПрдХ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рддрд┐рдмрд┐рдВрдмрд┐рдд рдХрд░реВрдВрдЧрд╛:


рдЗрдирдкреБрдЯ рдкреНрд░рдХрд╛рд░ -> рдкреНрд░рдХрд╛рд░, рдкреИрд░рд╛рдореАрдЯрд░ -> рдЖрдЙрдЯрдкреБрдЯ рдкреНрд░рдХрд╛рд░ [, рдЕрдВрддрд┐рдо рдкреНрд░рдХрд╛рд░ рдХрд╛ рдкреИрд░рд╛рдореАрдЯрд░ ]


рдПрдХ рд▓рд┐рдВрдХ рдХреЗ рд╕рд╛рде рдЙрджрд╛рд╣рд░рдг:


template<typename T> //   T void func(T& param) //   - T& int x = 0; //   int func(x); 

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


рдпрджрд┐ рдлрд╝рдВрдХреНрд╢рди рдкреИрд░рд╛рдореАрдЯрд░ рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рддреЛ рдЙрд╕реА рд╕рд┐рджреНрдзрд╛рдВрдд рджреНрд╡рд╛рд░рд╛, рдХрдмреНрдЬ рдХреЛ рдЫреЛрдбрд╝ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд▓рд┐рдВрдХ, рдкреЙрдЗрдВрдЯрд░реНрд╕, рдХреЙрдиреНрд╕реНрдЯреЗрдВрд╕реА рдкрд░, рдЬреИрд╕рд╛ рдХрд┐ рдпрд╣ рдерд╛, рдПрдХ рд╡рд┐рд╢реЗрд╖ рдореБрдЦреМрдЯрд╛ рд▓рдЧрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред


рдирд┐рдХрд╛рд╕реА рдпреЛрдЬрдирд╛


 //   int тАФ> (T & param) тАФ> int; const int тАФ> (T & param) тАФ> const int; const int & тАФ> (T & param) тАФ> const int //   int тАФ> (const T & param) тАФ> int; const int тАФ> (const T & param) тАФ> int; const int & тАФ> (const T & param) тАФ> int; //   int * тАФ> (T * param) тАФ> int; const int тАФ> (T * param) тАФ> const int; const int * тАФ> (T * param) тАФ> const int; //   int * тАФ> (const T * param) тАФ> int; const int тАФ> (const T * param) тАФ> int; const int * тАФ> (const T * param) тАФ> int; 

2. рддрд░реНрдХ рдХрд╛ рдкреНрд░рдХрд╛рд░ - рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рд╕рдВрджрд░реНрдн


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


 template<typename T> void func(const T&& param) 

рдмрдЪрд╛рд╡ рдХреЗ рд▓рд┐рдП рдирд┐рдпрдо


рдпрд╣, рд╕реНрдХреЙрдЯ рдХрд╛ рджрд╛рд╡рд╛ рд╣реИ, рдПрдХрдорд╛рддреНрд░ рдРрд╕рд╛ рдорд╛рдорд▓рд╛ рд╣реИ рдЬрд╣рд╛рдВ рдЯреА рдПрдХ рд╕рдВрджрд░реНрдн рдХреЗ рд░реВрдк рдореЗрдВ рдЖрдЙрдЯрдкреБрдЯ рд╣реИред
рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ, рдлрд╝рдВрдХреНрд╢рди рд╡рд┐рд╡рд░рдг рдореЗрдВ рдкреИрд░рд╛рдореАрдЯрд░ рдХрд╛ рдкреНрд░рдХрд╛рд░ рдПрдХ рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рд▓реИрд╡рд▓реНрдпреВ рд╕рдВрджрд░реНрдн рд╣реИ ред рдпрд╣ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЯреА рдХреЛ рдПрдХ рд▓рд┐рдВрдХ рдпрд╛ рдПрдХ рд╕реНрдерд┐рд░ рд▓рд┐рдВрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдпрд╣ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ
рдЗрдирдкреБрдЯ рддрд░реНрдХ рд╕реЗ, рдкрд░рдо рдкреИрд░рд╛рдореАрдЯрд░ рдХрд╛ рдкреНрд░рдХрд╛рд░ рднреА рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдПрдХ рд╕рдВрджрд░реНрдн рд╣реИред


 lvalue int тАФ> (T &&param) тАФ> int &, param - int& lvalue const int тАФ> (T &&param) тАФ> const int &, param - const int& lvalue const int & тАФ> (T &&param) тАФ> const int &, param - const int& 

рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рднреА рдмрджрд▓ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЗрд╕ рддрдереНрдп рдХреЗ рдХрд╛рд░рдг рд╣реИ рдХрд┐ рднрд╛рд╖рд╛ рдХрд╣реАрдВ рдКрдкрд░ рдЖрд╡рдВрдЯрд┐рдд рдПрдХ рд▓реИрд╡рд▓реНрдпреВ-рд╡реИрд░рд┐рдПрдмрд▓ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреА рд╣реИ, рдЬрд┐рд╕реЗ рдЖрдЧреЗ рд▓реЗ рдЬрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЬрдм рд╣рдо рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рд▓рд┐рдВрдХ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВрдЧреЗ рддреЛ рд╣рдо рдмрд╛рдж рдореЗрдВ рдЗрд╕рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдПрдВрдЧреЗред
рдпрд╣ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ T рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рд╕рдВрджрд░реНрдн рдкреНрд░рдХрд╛рд░ рд╣реИ, рдореИрдВрдиреЗ рдЯреЗрдореНрдкрд▓реЗрдЯ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╢рд░реАрд░ рдореЗрдВ T myVar рд▓рд┐рдЦрд╛, рдЬрд┐рд╕реЗ рдЗрд╕ рдЯреА рдиреЗ рджреЛрдиреЛрдВ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдФрд░ рдЕрдкреЗрдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рдПрдХ рд╕рдВрджреЗрд╢ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ - "рд╕рдВрджрд░реНрдн рдХреЗ рд░реВрдк рдореЗрдВ рдШреЛрд╖рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ" - рд▓рд┐рдВрдХ :)


рдмрдЪрд╛рд╡ рдХреЗ рд▓рд┐рдП рдирд┐рдпрдо


рдЕрдиреБрдЪреНрдЫреЗрдж 1 рдХреЗ "рд╕рд╛рдорд╛рдиреНрдп" рдирд┐рдпрдо рд▓рд╛рдЧреВ рд╣реЛрддреЗ рд╣реИрдВред


 rvalue int тАФ> (T &&param) тАФ> int, param - int&& 

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


3. рдорд╛рди рд╕реЗ рдкрд╛рд╕ рдХрд░реЗрдВ (рдЬреИрд╕рд╛ рд╣реИ)


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


 int тАФ> (T param) тАФ> int const int тАФ> (T param) тАФ> int const int & тАФ> (T param) тАФ> int //       ,     const char * const тАФ> (T param) тАФ> const char * 

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

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


All Articles