рдХрдбрд╝рд┐рдпреЛрдВ рдХрд╛ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдкрд░рд┐рдЪрдп

рдПрдХ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдкрд░рд┐рдЪрдп рдХрд╛ рдЕрдиреБрд╡рд╛рдж рд░реИрд╡рд▓реНрдпреВ рд╕рдиреНрджрд░реНрдн, рд╣реЙрд╡рд░реНрдб рдИред рд╣рд╛рдЗрдиреЗрдВрдЯ, рдмреНрд░реЗрдЬрд╝рди рд╕реНрдЯреНрд░реЙрд╕реНрдЯреНрд░реБрдк, рдмреНрд░реЛрдирдХ рдХреЛрдЬрд╝рд┐рдХреАред



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



рдкрд░рд┐рдЪрдп



рдпрд╣ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдирдП C ++ рднрд╛рд╖рд╛ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд╡рд┐рдЪрд╛рд░ рджреЗрддрд╛ рд╣реИ - рд░реИрд╡рд▓реНрдпреВ рд╕рдВрджрд░реНрднред рдпрд╣ рдПрдХ рдЫреЛрдЯрд╛ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рд╣реИ, рдкреВрд░рд╛ рд▓реЗрдЦ рдирд╣реАрдВред рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП рдЕрдВрдд рдореЗрдВ рд▓рд┐рдВрдХ рдХреА рд╕реВрдЪреА рджреЗрдЦреЗрдВред



рдХрдбрд╝реА рд▓рд┐рдВрдХ



рдПрдХ rvalue рд╕рдВрджрд░реНрдн рдПрдХ рдорд┐рд╢реНрд░рд┐рдд рдкреНрд░рдХрд╛рд░ рд╣реИ, рдЬреЛ C ++ рдореЗрдВ рдкрд╛рд░рдВрдкрд░рд┐рдХ рд╕рдВрджрд░реНрдн рдХреЗ рд╕рдорд╛рди рд╣реИред рдЗрди рджреЛ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдмреАрдЪ рдЕрдВрддрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдкрд╛рд░рдВрдкрд░рд┐рдХ C ++ рд▓рд┐рдВрдХ рдХреЛ рдПрдХ рд▓реИрд╡рд▓реНрдпреВ рд▓рд┐рдВрдХ рдХрд╣реЗрдВрдЧреЗред рдЬрдм рд╢рдмреНрдж рд▓рд┐рдВрдХ рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рд╣реИ, рддреЛ рдпрд╣ рджреЛрдиреЛрдВ рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдВрдХ рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИ, рдФрд░ рд▓рд┐рдВрдХ рдХреЛ рд▓рд┐рдВрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдФрд░ рд▓рд┐рдВрдХ рдХреЛ рд▓рд┐рдВрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред



рд▓реИрд╡рд▓реНрдпреВ рдХреЗ рд╢рдмреНрджрд╛рд░реНрде рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдкреНрд░рдХрд╛рд░ рдХреЗ рдбрд╛рд▓рдиреЗ рдФрд░ рдЙрд╕рдХреЗ рдмрд╛рдж рдПрдХ рд▓рд┐рдВрдХ рдмрдирддрд╛ рд╣реИред



A a; A& a_ref1 = a; //  lvalue 
      
      





рдпрджрд┐ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреЗ рдмрд╛рдж рд╣рдо && рдбрд╛рд▓рддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рдПрдХ рд▓рд┐рдВрдХ рдорд┐рд▓рддрд╛ рд╣реИред



 A a; A&& a_ref2 = a; //  rvalue 
      
      





рдПрдХ рд░реЗрд╡рд▓реНрдпреВ рд░реЗрдлрд░реЗрдВрд╕ рд▓реИрд╡рд▓реНрдпреВ рд░реЗрдлрд░реЗрдВрд╕ рдХреА рддрд░рд╣ рд╣реА рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рддрд╛ рд╣реИ, рд╕рд┐рд╡рд╛рдп рдЗрд╕рдХреЗ рдХрд┐ рдЗрд╕реЗ рдПрдХ рдЕрд╕реНрдерд╛рдпреА рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд╕рд╛рде рдЬреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬрдмрдХрд┐ рдПрдХ рд▓реИрд╡рд▓реНрдпреВ рдХреЛ рдПрдХ рдЕрд╕реНрдерд╛рдпреА (рдЧреИрд░-рд╕реНрдерд┐рд░) рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд╕рд╛рде рдирд╣реАрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред



 A& a_ref3 = A(); // ! A&& a_ref4 = A(); // Ok
      
      





рдкреНрд░рд╢реНрди: рд╣рдореЗрдВ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рд╣реЛрдЧреА?!



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



рдЖрдВрджреЛрд▓рдиреЛрдВ рдХреЗ рд╢рдмреНрджрд╛рд░реНрде (рдЪрд╛рд▓ рд╢рдмреНрджрд╛рд░реНрде)



рд╕рд╛рдЗрдб рдХреЙрдкреА рдПрд▓рд┐рдорд┐рдиреЗрд╢рди


рдирдХрд▓ рдХрд░рдирд╛ рдПрдХ рдорд╣рдВрдЧрд╛ рдЖрдирдВрдж рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рджреЛ рд╡реИрдХреНрдЯрд░ рдХреЗ рд▓рд┐рдП, рдЬрдм рд╣рдо v2 = v1



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



 template <class T> swap(T& a, T& b) { T tmp(a); //       a a = b; //        b b = tmp; //        tmp (.. a) }
      
      





рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╣рдореЗрдВ a



рдпрд╛ b



рдХреА рдкреНрд░рддрд┐рдпреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рд╣рдо рд╕рд┐рд░реНрдл рдЙрдиреНрд╣реЗрдВ рд╡рд┐рдирд┐рдордп рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рдереЗред рдЖрдЗрдП рдлрд┐рд░ рд╕реЗ рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ:



 template <class T> swap(T& a, T& b) { T tmp(std::move(a)); a = std::move(b); b = std::move(tmp); }
      
      





рдпрд╣ рдХреЙрд▓ move()



рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд░рд┐рдд рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рдорд╛рди рд▓реМрдЯрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреА рд╕реБрд░рдХреНрд╖рд╛ рдХреА рдЧрд╛рд░рдВрдЯреА рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдЖрдк vector



рдХреЛ move()



рдореЗрдВ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд╕ рдХрд░рддреЗ move()



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



рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдордиреЗ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ swap



рдЕрдиреБрдХреВрд▓рд┐рдд swap



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



рд░рд┐рд╡рд╛рд▓реНрдпреВ рд▓рд┐рдВрдХ рдХрд╛ рдореБрдЦреНрдп рдХрд╛рд░реНрдп рд╣рдореЗрдВ рдкреБрдирд░реНрд▓реЗрдЦрди рдХреЛрдб рдпрд╛ рд░рдирдЯрд╛рдЗрдо рдУрд╡рд░рд╣реЗрдб рдХреЗ рдмрд┐рдирд╛ рд╕реНрдерд╛рдирд╛рдВрддрд░рдг рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдирд╛ рд╣реИред



рдЪрд╛рд▓


move



рд╕рдорд╛рд░реЛрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рдмрд╣реБрдд рд╣реА рдорд╛рдореВрд▓реА рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдЙрд╕рдХрд╛ рдХрд╛рдо рдпрд╛ рддреЛ рд▓рд╡рд▓реНрдпреВ рдпрд╛ рд░рд┐рд╡рд▓реНрдпреВ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдирд╛ рд╣реИ рдФрд░ рдЙрд╕реЗ рдХреЙрдкреА рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЛ рдХреЙрд▓ рдХрд┐рдП рдмрд┐рдирд╛ рдЙрд╕реЗ рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рд╣реИ:



 template <class T> typename remove_reference<T>::type&& move(T&& a) { return a; }
      
      





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



рдУрд╡рд▓реНрдпреВрд╢рди / рд░рд┐рд╡рд▓реНрдпреВ рдХреЗ рд▓рд┐рдП рдУрд╡рд░рд▓реЛрдб


рдПрдХ рд╕рд╛рдзрд╛рд░рдг рд╡рд░реНрдЧ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ рдЬреЛ рдПрдХ рд╕рдВрд╕рд╛рдзрди рдХрд╛ рдорд╛рд▓рд┐рдХ рд╣реИ рдФрд░ рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рд╢рдмреНрджрд╛рд░реНрде (рдХреЙрдкреА рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдФрд░ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдСрдкрд░реЗрдЯрд░) рднреА рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, clone_ptr



рдПрдХ рдкреЙрдЗрдВрдЯрд░ рдХрд╛ clone_ptr



рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдХреЙрдкреА рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрд╕ рдкрд░ рдорд╣рдВрдЧрд╛ clone()



рд╡рд┐рдзрд┐ clone_ptr



рд╕рдХрддрд╛ рд╣реИ:



 template <class T> class clone_ptr { private: T* ptr; public: //  explicit clone_ptr(T* p = 0) : ptr(p) {} //  ~clone_ptr() {delete ptr;} //   clone_ptr(const clone_ptr& p) : ptr(p.ptr ? p.ptr->clone() : 0) {} clone_ptr& operator=(const clone_ptr& p) { if (this != &p) { delete ptr; ptr = p.ptr ? p.ptr->clone() : 0; } return *this; } //   clone_ptr(clone_ptr&& p) : ptr(p.ptr) {p.ptr = 0;} clone_ptr& operator=(clone_ptr&& p) { std::swap(ptr, p.ptr); return *this; } //   T& operator*() const {return *ptr;} // ... };
      
      





рдЪрд╛рд▓ рд╢рдмреНрджрд╛рд░реНрде рдХреЗ рдЕрдкрд╡рд╛рдж рдХреЗ рд╕рд╛рде, clone_ptr



рдЖрдЬ рдХреА C ++ рдкреБрд╕реНрддрдХреЛрдВ рдореЗрдВ рдкрд╛рдпрд╛ рдЧрдпрд╛ рдХреЛрдб рд╣реИред рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрд╕ рддрд░рд╣ clone_ptr



рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:



 clone_ptr<base> p1(new derived); // ... clone_ptr<base> p2 = p1; //  p2  p1     
      
      







рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ clone_ptr



рд▓рд┐рдП рдПрдХ рдХреЙрдкреА рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдпрд╛ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдСрдкрд░реЗрдЯрд░ рдХреЛ clone_ptr



рдХрд░рдирд╛ рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рдорд╣рдВрдЧрд╛ рдСрдкрд░реЗрд╢рди рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЬрдм рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рд╕реНрд░реЛрдд рдХрд╛ рдкреНрд░рдЪрд▓рди рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдЖрдк рд╕рдВрднрд╛рд╡рд┐рдд рд╕реВрдЪрдХ (рдЪреЛрд░реА рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗ!) рдХреЛ рдЪреБрд░рд╛рдХрд░ рд╕рдВрднрд╛рд╡рд┐рдд рдорд╣рдВрдЧреЗ clone()



рдСрдкрд░реЗрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рд╕реЗ рдмрдЪ рд╕рдХрддреЗ рд╣реИрдВред рдореВрд╡ рд╕рд┐рдореЗрдВрдЯрд┐рдХреНрд╕ рдореЗрдВ, рдореВрд╡ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рд░реЙрд▓реНрдпреВ рд╡реИрд▓реНрдпреВ рдХреЛ рдирд┐рд░реНрдорд┐рдд рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рдЫреЛрдбрд╝ рджреЗрддрд╛ рд╣реИ, рдФрд░ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдСрдкрд░реЗрдЯрд░ рд▓рд┐рдВрдХ рдХреЗ рд░рд╡реНрдпреВ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд╕рд╛рде рдХрд░рдВрдЯ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдорд╛рдиреЛрдВ рдХреЛ рд╕реНрд╡реИрдк рдХрд░рддрд╛ рд╣реИред



рдЕрдм, рдЬрдм рдХреЛрдб rvalue clone_ptr



рдХреЛ рдХреЙрдкреА рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддрд╛ рд╣реИ, рдпрд╛ рдЕрдЧрд░ рд╡рд╣рд╛рдБ rvalue рдХреЙрдкреА рдХреЗ рд╕реНрд░реЛрдд рдХреЛ рдкрдврд╝рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рд╣реИ ( std::move



clone_ptr



) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рддреЛ рдХрд╛рдо рдмрд╣реБрдд рддреЗрдЬреА рд╕реЗ рд╣реЛрдЧрд╛ред



 clone_ptr<base> p1(new derived); // ... clone_ptr<base> p2 = std::move(p1); //  p2  ,  p1
      
      





рдЕрдиреНрдп рд╡рд░реНрдЧреЛрдВ (рдпрд╛ рддреЛ рд╕рдорд╛рд╡реЗрд╢рди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ, рдпрд╛ рд╡рд┐рд░рд╛рд╕рдд рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ) рд╕реЗ рдмрдиреЗ рд╡рд░реНрдЧреЛрдВ рдХреЗ рд▓рд┐рдП, рдореВрд╡ рдХрдВрд╕реНрдЯреНрд░рдХреНрд╢рди рдФрд░ рдореВрд╡ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдХреЛ рдЖрд╕рд╛рдиреА рд╕реЗ std::move



рдлрдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред



 class Derived : public Base { std::vector<int> vec; std::string name; // ... public: // ... //   Derived(Derived&& x) //   rvalue : Base(std::move(x)), vec(std::move(x.vec)), name(std::move(x.name)) { } Derived& operator=(Derived&& x) //   rvalue { Base::operator=(std::move(x)); vec = std::move(x.vec); name = std::move(x.name); return *this; } // ... };
      
      





рдкреНрд░рддреНрдпреЗрдХ рдЙрдк-рд╡рд┐рд╖рдп рдХреЛ рдЕрдм рдореВрд╡ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдФрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдореВрд╡ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдСрдкрд░реЗрдЯрд░ рдореЗрдВ рдПрдХ рдкреНрд░рддрд┐рджреНрд╡рдВрджреНрд╡рд┐рддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдорд╛рдирд╛ рдЬрд╛рдПрдЧрд╛ред std::vector



рдФрд░ std::string



, рдореВрд╡ рдСрдкрд░реЗрд╢рдВрд╕ рдкрд╣рд▓реЗ рд╣реА рд▓рд╛рдЧреВ рдХрд┐рдП рдЬрд╛ рдЪреБрдХреЗ рд╣реИрдВ (рд╣рдорд╛рд░реЗ clone_ptr



рддрд░рд╣), рдЬреЛ рд╣рдореЗрдВ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдорд╣рдВрдЧреА рдХреЙрдкреА рдСрдкрд░реЗрд╢рди рд╕реЗ рдмрдЪрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред



рдпрд╣ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ рдкреИрд░рд╛рдореАрдЯрд░ x



рдкреБрдирд░реНрд╡рд╛рд╕ рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рдПрдХ рдЕрдВрддрд░рд╛рд▓ рдХреЗ рд░реВрдк x



рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕ рддрдереНрдп рдХреЗ рдмрд╛рд╡рдЬреВрдж рдХрд┐ рдЗрд╕реЗ рдПрдХ рд╕рдВрджрд░реНрдн рд╕рдВрджрд░реНрдн рдХреЗ рд░реВрдк рдореЗрдВ рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдЖрдкрдХреЛ рдмреЗрд╕ рдХреНрд▓рд╛рд╕ рдореЗрдВ рдкрд╛рд╕ рд╣реЛрдиреЗ рдкрд░ рд╕рд┐рд░реНрдл x



рдмрдЬрд╛рдп move(x)



рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрд╣ рдХрджрдо рд╢рдмреНрджрд╛рд░реНрде рдХреЗ рд▓рд┐рдП рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╕реБрд░рдХреНрд╖рд╛ рддрдВрддреНрд░ рд╣реИ, рдЬрд┐рд╕реЗ рдПрдХ рдирд╛рдорд┐рдд рдЪрд░ рд╕реЗ рджреЛрд╣рд░реЗ рдЪрд╛рд▓ рдХреЛ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЖрдХрд╕реНрдорд┐рдХ рдкреНрд░рдпрд╛рд╕ рдХреЛ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рд╕рднреА рдЖрдВрджреЛрд▓рди рдХреЗрд╡рд▓ rvalues тАЛтАЛрд╕реЗ рд╣реЛрддреЗ рд╣реИрдВ рдпрд╛ рдПрдХ рд╕реНрдкрд╖реНрдЯ рдХрд▓рд╛рдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде rvalue ( std::move



Move) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдпрджрд┐ рдЪрд░ рдХрд╛ рдирд╛рдо рд╣реИ, рддреЛ рдпрд╣ рдПрдХ рдЕрдВрддрд░рд╛рд▓ рд╣реИред



рдкреНрд░рд╢реНрди: рдРрд╕реЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд┐рдирдХреЗ рдкрд╛рд╕ рд╕рдВрд╕рд╛рдзрди рдирд╣реАрдВ рд╣реИрдВ? (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, std::complex



?)



рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдХрд┐рд╕реА рднреА рдХрд╛рд░реНрдп рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдирд┐рд░реНрдорд╛рддрд╛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдкреНрд░рддрд┐рджреНрд╡рдВрджреНрд╡рд┐рддрд╛ рдХреЗ рд╕рд╛рде рдирдХрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╖реНрдЯрддрдо рд╣реИред



рдЬрдВрдЧрдо рд▓реЗрдХрд┐рди рдирдХрд▓ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдкреНрд░рдХрд╛рд░ рдирд╣реАрдВ



рдХреБрдЫ рдкреНрд░рдХрд╛рд░ рдХреА рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдХреЗ рд▓рд┐рдП рд╢рдмреНрджрд╛рд░реНрде рд▓рд╛рдЧреВ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЙрдиреНрд╣реЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:





рдпрджрд┐ рдРрд╕реЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдЪрд▓ (рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╡реЗ рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдирд╣реАрдВ рдмрдиреЗ рд░рд╣рддреЗ) рдмрдирд╛рдП рдЬрд╛рддреЗ рд╣реИрдВ, рддреЛ рдЙрдирдХреА рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдмрд╣реБрдд рдмрдврд╝ рдЬрд╛рддреА рд╣реИред рдПрдХ рдЪрд▓ рд▓реЗрдХрд┐рди рдХреЙрдкреА рдХреА рдЧрдИ рд╡рд╕реНрддреБ рдХреЛ рдлреИрдХреНрдЯреНрд░реА рд╡рд┐рдзрд┐ (рдкреИрдЯрд░реНрди) рд╕реЗ рдореВрд▓реНрдп рджреНрд╡рд╛рд░рд╛ рд╡рд╛рдкрд╕ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:



 ifstream find_and_open_data_file(/* ... */); ... ifstream data_file = find_and_open_data_file(/* ... */); //  !
      
      





рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдмреЗрд╕ рдлрд╛рдЗрд▓ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рдХреЛ рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рд╕реЗ рджреВрд╕рд░реЗ рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ ifstream



рд╕реНрд░реЛрдд рд╡реНрдпрд╛рдкреНрдд рд╣реИред рдХрд┐рд╕реА рднреА рд╕рдордп, рдХреЗрд╡рд▓ рдПрдХ рдлрд╝рд╛рдЗрд▓ рд╡рд┐рд╡рд░рдгрдХ рд╣реЛрддрд╛ рд╣реИ, рдФрд░ рдХреЗрд╡рд▓ рдПрдХ ifstream



рдХрд╛ рдорд╛рд▓рд┐рдХ рд╣реЛрддрд╛ рд╣реИред



рдПрдХ relocatable рд▓реЗрдХрд┐рди рдирдХрд▓ рдирд╣реАрдВ рдкреНрд░рдХрд╛рд░ рднреА рдорд╛рдирдХ рдХрдВрдЯреЗрдирд░реЛрдВ рдореЗрдВ рд░рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрджрд┐ рдХрдВрдЯреЗрдирд░ рдХреЛ рдЕрдкрдиреЗ рдЕрдВрджрд░ рдХреЗ рддрддреНрд╡ рдХреЛ "рдХреЙрдкреА" рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, vector



рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╕рдордп), рддреЛ рдпрд╣ рдХреЙрдкреА рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп рдЗрд╕реЗ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░ рджреЗрдЧрд╛ред



 vector<unique_ptr<base>> v1, v2; v1.push_back(unique_ptr<base>(new derived())); // OK,    ... v2 = v1; //   !    . v2 = move(v1); //  .     v2.
      
      





рдХрдИ рдорд╛рдирдХ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдЙрдиреНрд╣реЗрдВ рдХреЙрдкреА рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп рдПрдХ рдЕрдиреБрдХреНрд░рдо рдХреЗ рдЪрд▓рддреЗ рддрддреНрд╡реЛрдВ рд╕реЗ рд▓рд╛рднрд╛рдиреНрд╡рд┐рдд рд╣реЛрддреЗ рд╣реИрдВред рдпрд╣ рди рдХреЗрд╡рд▓ рдмреЗрд╣рддрд░ рдкреНрд░рджрд░реНрд╢рди рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ (рдЬреИрд╕рд╛ рдХрд┐ std::swap



рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЬрд┐рд╕рдХрд╛ рдХреНрд░рд┐рдпрд╛рдиреНрд╡рдпрди рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рд╣реИ), рд▓реЗрдХрд┐рди рдЗрди рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЛ рдЕрд╡рд░реНрдгрдиреАрдп (рд▓реЗрдХрд┐рди рдЪрд▓) рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдирд┐рдореНрди рдХреЛрдб рд╕реЙрд░реНрдЯ рдХрд░рддрд╛ рд╣реИ
 vector<unique_ptr>,   ,     : 
      



struct indirect_less { template <class T> bool operator()(const T& x, const T& y) {return *x < *y;} }; ... std::vector<std::unique_ptr<A>> v; ... std::sort(v.begin(), v.end(), indirect_less());






unique_ptr



, swap



( , ) / . , , . ( , ), .



(perfect forwarding)

, std::shared_ptr



. . , , . :



template <class T> std::shared_ptr<T> factory() // { return std::shared_ptr<T>(new T); } template <class T, class A1> std::shared_ptr<T> factory(const A1& a1) // { return std::shared_ptr<T>(new T(a1)); } //





. :



std::shared_ptr<A> p = factory<A>(5);





: , T



?



, factory



T



.



factory



:



template <class T, class A1> std::shared_ptr<T> factory(A1& a1) { return std::shared_ptr<T>(new T(a1)); }





. const



factory



, (, A1



) T



. , , T



. (, std::bind



).



:



std::shared_ptr<A> p = factory<A>(5); // ! A* q = new A(5); // OK





factory



, "5" factory



, int&



rvalue "5". , , .



: AI



& const AI



&?



, : 4 . 8 . 16 .. .



Rvalue :



template <class T, class A1> std::shared_ptr<T> factory(A1&& a1) { return std::shared_ptr<T>(new T(std::forward<A1>(a1))); }





rvalue factory



. const



, factory



.



: forward



?



move



, forward



- , , , . a1



, .



, forward



lvalue/rvalue , factory



. factory



rvalue, forward



T



rvalue. , lvalue factory



, T



lvalue.



forward



:



template <class T> struct identity { typedef T type; }; template <class T> T&& forward(typename identity<T>::type&& a) { return a; }







, . , 95% .



, , , , N1377 .



N1385 .



rvalue ( ), N1690 .



, rvalue , N1952 .



rvalue , N2027 .



rvalue , N1771 .



, rvalue , :

N1856 N1857 N1858 N1859 N1860 N1861 N1862

rvalue (this), N1821 .




vector<unique_ptr>, , :



struct indirect_less { template <class T> bool operator()(const T& x, const T& y) {return *x < *y;} }; ... std::vector<std::unique_ptr<A>> v; ... std::sort(v.begin(), v.end(), indirect_less());






unique_ptr



, swap



( , ) / . , , . ( , ), .



(perfect forwarding)

, std::shared_ptr



. . , , . :



template <class T> std::shared_ptr<T> factory() // { return std::shared_ptr<T>(new T); } template <class T, class A1> std::shared_ptr<T> factory(const A1& a1) // { return std::shared_ptr<T>(new T(a1)); } //





. :



std::shared_ptr<A> p = factory<A>(5);





: , T



?



, factory



T



.



factory



:



template <class T, class A1> std::shared_ptr<T> factory(A1& a1) { return std::shared_ptr<T>(new T(a1)); }





. const



factory



, (, A1



) T



. , , T



. (, std::bind



).



:



std::shared_ptr<A> p = factory<A>(5); // ! A* q = new A(5); // OK





factory



, "5" factory



, int&



rvalue "5". , , .



: AI



& const AI



&?



, : 4 . 8 . 16 .. .



Rvalue :



template <class T, class A1> std::shared_ptr<T> factory(A1&& a1) { return std::shared_ptr<T>(new T(std::forward<A1>(a1))); }





rvalue factory



. const



, factory



.



: forward



?



move



, forward



- , , , . a1



, .



, forward



lvalue/rvalue , factory



. factory



rvalue, forward



T



rvalue. , lvalue factory



, T



lvalue.



forward



:



template <class T> struct identity { typedef T type; }; template <class T> T&& forward(typename identity<T>::type&& a) { return a; }







, . , 95% .



, , , , N1377 .



N1385 .



rvalue ( ), N1690 .



, rvalue , N1952 .



rvalue , N2027 .



rvalue , N1771 .



, rvalue , :

N1856 N1857 N1858 N1859 N1860 N1861 N1862

rvalue (this), N1821 .




vector<unique_ptr>, , :



struct indirect_less { template <class T> bool operator()(const T& x, const T& y) {return *x < *y;} }; ... std::vector<std::unique_ptr<A>> v; ... std::sort(v.begin(), v.end(), indirect_less());






unique_ptr



, swap



( , ) / . , , . ( , ), .



(perfect forwarding)

, std::shared_ptr



. . , , . :



template <class T> std::shared_ptr<T> factory() // { return std::shared_ptr<T>(new T); } template <class T, class A1> std::shared_ptr<T> factory(const A1& a1) // { return std::shared_ptr<T>(new T(a1)); } //





. :



std::shared_ptr<A> p = factory<A>(5);





: , T



?



, factory



T



.



factory



:



template <class T, class A1> std::shared_ptr<T> factory(A1& a1) { return std::shared_ptr<T>(new T(a1)); }





. const



factory



, (, A1



) T



. , , T



. (, std::bind



).



:



std::shared_ptr<A> p = factory<A>(5); // ! A* q = new A(5); // OK





factory



, "5" factory



, int&



rvalue "5". , , .



: AI



& const AI



&?



, : 4 . 8 . 16 .. .



Rvalue :



template <class T, class A1> std::shared_ptr<T> factory(A1&& a1) { return std::shared_ptr<T>(new T(std::forward<A1>(a1))); }





rvalue factory



. const



, factory



.



: forward



?



move



, forward



- , , , . a1



, .



, forward



lvalue/rvalue , factory



. factory



rvalue, forward



T



rvalue. , lvalue factory



, T



lvalue.



forward



:



template <class T> struct identity { typedef T type; }; template <class T> T&& forward(typename identity<T>::type&& a) { return a; }







, . , 95% .



, , , , N1377 .



N1385 .



rvalue ( ), N1690 .



, rvalue , N1952 .



rvalue , N2027 .



rvalue , N1771 .



, rvalue , :

N1856 N1857 N1858 N1859 N1860 N1861 N1862

rvalue (this), N1821 .




vector<unique_ptr>, , :



struct indirect_less { template <class T> bool operator()(const T& x, const T& y) {return *x < *y;} }; ... std::vector<std::unique_ptr<A>> v; ... std::sort(v.begin(), v.end(), indirect_less());






unique_ptr



, swap



( , ) / . , , . ( , ), .



(perfect forwarding)

, std::shared_ptr



. . , , . :



template <class T> std::shared_ptr<T> factory() // { return std::shared_ptr<T>(new T); } template <class T, class A1> std::shared_ptr<T> factory(const A1& a1) // { return std::shared_ptr<T>(new T(a1)); } //





. :



std::shared_ptr<A> p = factory<A>(5);





: , T



?



, factory



T



.



factory



:



template <class T, class A1> std::shared_ptr<T> factory(A1& a1) { return std::shared_ptr<T>(new T(a1)); }





. const



factory



, (, A1



) T



. , , T



. (, std::bind



).



:



std::shared_ptr<A> p = factory<A>(5); // ! A* q = new A(5); // OK





factory



, "5" factory



, int&



rvalue "5". , , .



: AI



& const AI



&?



, : 4 . 8 . 16 .. .



Rvalue :



template <class T, class A1> std::shared_ptr<T> factory(A1&& a1) { return std::shared_ptr<T>(new T(std::forward<A1>(a1))); }





rvalue factory



. const



, factory



.



: forward



?



move



, forward



- , , , . a1



, .



, forward



lvalue/rvalue , factory



. factory



rvalue, forward



T



rvalue. , lvalue factory



, T



lvalue.



forward



:



template <class T> struct identity { typedef T type; }; template <class T> T&& forward(typename identity<T>::type&& a) { return a; }







, . , 95% .



, , , , N1377 .



N1385 .



rvalue ( ), N1690 .



, rvalue , N1952 .



rvalue , N2027 .



rvalue , N1771 .



, rvalue , :

N1856 N1857 N1858 N1859 N1860 N1861 N1862

rvalue (this), N1821 .




 vector<unique_ptr>,   ,     : 
      



struct indirect_less { template <class T> bool operator()(const T& x, const T& y) {return *x < *y;} }; ... std::vector<std::unique_ptr<A>> v; ... std::sort(v.begin(), v.end(), indirect_less());






unique_ptr



, swap



( , ) / . , , . ( , ), .



(perfect forwarding)

, std::shared_ptr



. . , , . :



template <class T> std::shared_ptr<T> factory() // { return std::shared_ptr<T>(new T); } template <class T, class A1> std::shared_ptr<T> factory(const A1& a1) // { return std::shared_ptr<T>(new T(a1)); } //





. :



std::shared_ptr<A> p = factory<A>(5);





: , T



?



, factory



T



.



factory



:



template <class T, class A1> std::shared_ptr<T> factory(A1& a1) { return std::shared_ptr<T>(new T(a1)); }





. const



factory



, (, A1



) T



. , , T



. (, std::bind



).



:



std::shared_ptr<A> p = factory<A>(5); // ! A* q = new A(5); // OK





factory



, "5" factory



, int&



rvalue "5". , , .



: AI



& const AI



&?



, : 4 . 8 . 16 .. .



Rvalue :



template <class T, class A1> std::shared_ptr<T> factory(A1&& a1) { return std::shared_ptr<T>(new T(std::forward<A1>(a1))); }





rvalue factory



. const



, factory



.



: forward



?



move



, forward



- , , , . a1



, .



, forward



lvalue/rvalue , factory



. factory



rvalue, forward



T



rvalue. , lvalue factory



, T



lvalue.



forward



:



template <class T> struct identity { typedef T type; }; template <class T> T&& forward(typename identity<T>::type&& a) { return a; }







, . , 95% .



, , , , N1377 .



N1385 .



rvalue ( ), N1690 .



, rvalue , N1952 .



rvalue , N2027 .



rvalue , N1771 .



, rvalue , :

N1856 N1857 N1858 N1859 N1860 N1861 N1862

rvalue (this), N1821 .




vector<unique_ptr>, , :



struct indirect_less { template <class T> bool operator()(const T& x, const T& y) {return *x < *y;} }; ... std::vector<std::unique_ptr<A>> v; ... std::sort(v.begin(), v.end(), indirect_less());






unique_ptr



, swap



( , ) / . , , . ( , ), .



(perfect forwarding)

, std::shared_ptr



. . , , . :



template <class T> std::shared_ptr<T> factory() // { return std::shared_ptr<T>(new T); } template <class T, class A1> std::shared_ptr<T> factory(const A1& a1) // { return std::shared_ptr<T>(new T(a1)); } //





. :



std::shared_ptr<A> p = factory<A>(5);





: , T



?



, factory



T



.



factory



:



template <class T, class A1> std::shared_ptr<T> factory(A1& a1) { return std::shared_ptr<T>(new T(a1)); }





. const



factory



, (, A1



) T



. , , T



. (, std::bind



).



:



std::shared_ptr<A> p = factory<A>(5); // ! A* q = new A(5); // OK





factory



, "5" factory



, int&



rvalue "5". , , .



: AI



& const AI



&?



, : 4 . 8 . 16 .. .



Rvalue :



template <class T, class A1> std::shared_ptr<T> factory(A1&& a1) { return std::shared_ptr<T>(new T(std::forward<A1>(a1))); }





rvalue factory



. const



, factory



.



: forward



?



move



, forward



- , , , . a1



, .



, forward



lvalue/rvalue , factory



. factory



rvalue, forward



T



rvalue. , lvalue factory



, T



lvalue.



forward



:



template <class T> struct identity { typedef T type; }; template <class T> T&& forward(typename identity<T>::type&& a) { return a; }







, . , 95% .



, , , , N1377 .



N1385 .



rvalue ( ), N1690 .



, rvalue , N1952 .



rvalue , N2027 .



rvalue , N1771 .



, rvalue , :

N1856 N1857 N1858 N1859 N1860 N1861 N1862

rvalue (this), N1821 .




 vector<unique_ptr>,   ,     : 
      



struct indirect_less { template <class T> bool operator()(const T& x, const T& y) {return *x < *y;} }; ... std::vector<std::unique_ptr<A>> v; ... std::sort(v.begin(), v.end(), indirect_less());






unique_ptr



, swap



( , ) / . , , . ( , ), .



(perfect forwarding)

, std::shared_ptr



. . , , . :



template <class T> std::shared_ptr<T> factory() // { return std::shared_ptr<T>(new T); } template <class T, class A1> std::shared_ptr<T> factory(const A1& a1) // { return std::shared_ptr<T>(new T(a1)); } //





. :



std::shared_ptr<A> p = factory<A>(5);

: , T



?



, factory



T



.



factory



:



template <class T, class A1> std::shared_ptr<T> factory(A1& a1) { return std::shared_ptr<T>(new T(a1)); }





. const



factory



, (, A1



) T



. , , T



. (, std::bind



).



:



std::shared_ptr<A> p = factory<A>(5); // ! A* q = new A(5); // OK





factory



, "5" factory



, int&



rvalue "5". , , .



: AI



& const AI



&?



, : 4 . 8 . 16 .. .



Rvalue :



template <class T, class A1> std::shared_ptr<T> factory(A1&& a1) { return std::shared_ptr<T>(new T(std::forward<A1>(a1))); }





rvalue factory



. const



, factory



.



: forward



?



move



, forward



- , , , . a1



, .



, forward



lvalue/rvalue , factory



. factory



rvalue, forward



T



rvalue. , lvalue factory



, T



lvalue.



forward



:



template <class T> struct identity { typedef T type; }; template <class T> T&& forward(typename identity<T>::type&& a) { return a; }







, . , 95% .



, , , , N1377 .



N1385 .



rvalue ( ), N1690 .



, rvalue , N1952 .



rvalue , N2027 .



rvalue , N1771 .



, rvalue , :

N1856 N1857 N1858 N1859 N1860 N1861 N1862

rvalue (this), N1821 .








vector<unique_ptr>, , :



struct indirect_less { template <class T> bool operator()(const T& x, const T& y) {return *x < *y;} }; ... std::vector<std::unique_ptr<A>> v; ... std::sort(v.begin(), v.end(), indirect_less());






unique_ptr



, swap



( , ) / . , , . ( , ), .



(perfect forwarding)

, std::shared_ptr



. . , , . :



template <class T> std::shared_ptr<T> factory() // { return std::shared_ptr<T>(new T); } template <class T, class A1> std::shared_ptr<T> factory(const A1& a1) // { return std::shared_ptr<T>(new T(a1)); } //





. :



std::shared_ptr<A> p = factory<A>(5);





: , T



?



, factory



T



.



factory



:



template <class T, class A1> std::shared_ptr<T> factory(A1& a1) { return std::shared_ptr<T>(new T(a1)); }





. const



factory



, (, A1



) T



. , , T



. (, std::bind



).



:



std::shared_ptr<A> p = factory<A>(5); // ! A* q = new A(5); // OK





factory



, "5" factory



, int&



rvalue "5". , , .



: AI



& const AI



&?



, : 4 . 8 . 16 .. .



Rvalue :



template <class T, class A1> std::shared_ptr<T> factory(A1&& a1) { return std::shared_ptr<T>(new T(std::forward<A1>(a1))); }





rvalue factory



. const



, factory



.



: forward



?



move



, forward



- , , , . a1



, .



, forward



lvalue/rvalue , factory



. factory



rvalue, forward



T



rvalue. , lvalue factory



, T



lvalue.



forward



:



template <class T> struct identity { typedef T type; }; template <class T> T&& forward(typename identity<T>::type&& a) { return a; }







, . , 95% .



, , , , N1377 .



N1385 .



rvalue ( ), N1690 .



, rvalue , N1952 .



rvalue , N2027 .



rvalue , N1771 .



, rvalue , :

N1856 N1857 N1858 N1859 N1860 N1861 N1862

rvalue (this), N1821 .




 vector<unique_ptr>,   ,     : 
      



struct indirect_less { template <class T> bool operator()(const T& x, const T& y) {return *x < *y;} }; ... std::vector<std::unique_ptr<A>> v; ... std::sort(v.begin(), v.end(), indirect_less());






unique_ptr



, swap



( , ) / . , , . ( , ), .



(perfect forwarding)

, std::shared_ptr



. . , , . :



template <class T> std::shared_ptr<T> factory() // { return std::shared_ptr<T>(new T); } template <class T, class A1> std::shared_ptr<T> factory(const A1& a1) // { return std::shared_ptr<T>(new T(a1)); } //





. :



std::shared_ptr<A> p = factory<A>(5);





: , T



?



, factory



T



.



factory



:



template <class T, class A1> std::shared_ptr<T> factory(A1& a1) { return std::shared_ptr<T>(new T(a1)); }





. const



factory



, (, A1



) T



. , , T



. (, std::bind



).



:



std::shared_ptr<A> p = factory<A>(5); // ! A* q = new A(5); // OK





factory



, "5" factory



, int&



rvalue "5". , , .



: AI



& const AI



&?



, : 4 . 8 . 16 .. .



Rvalue :



template <class T, class A1> std::shared_ptr<T> factory(A1&& a1) { return std::shared_ptr<T>(new T(std::forward<A1>(a1))); }





rvalue factory



. const



, factory



.



: forward



?



move



, forward



- , , , . a1



, .



, forward



lvalue/rvalue , factory



. factory



rvalue, forward



T



rvalue. , lvalue factory



, T



lvalue.



forward



:



template <class T> struct identity { typedef T type; }; template <class T> T&& forward(typename identity<T>::type&& a) { return a; }







, . , 95% .



, , , , N1377 .



N1385 .



rvalue ( ), N1690 .



, rvalue , N1952 .



rvalue , N2027 .



rvalue , N1771 .



, rvalue , :

N1856 N1857 N1858 N1859 N1860 N1861 N1862

rvalue (this), N1821 .




vector<unique_ptr>, , :



struct indirect_less { template <class T> bool operator()(const T& x, const T& y) {return *x < *y;} }; ... std::vector<std::unique_ptr<A>> v; ... std::sort(v.begin(), v.end(), indirect_less());






unique_ptr



, swap



( , ) / . , , . ( , ), .



(perfect forwarding)

, std::shared_ptr



. . , , . :



template <class T> std::shared_ptr<T> factory() // { return std::shared_ptr<T>(new T); } template <class T, class A1> std::shared_ptr<T> factory(const A1& a1) // { return std::shared_ptr<T>(new T(a1)); } //





. :



std::shared_ptr<A> p = factory<A>(5);





: , T



?



, factory



T



.



factory



:



template <class T, class A1> std::shared_ptr<T> factory(A1& a1) { return std::shared_ptr<T>(new T(a1)); }





. const



factory



, (, A1



) T



. , , T



. (, std::bind



).



:



std::shared_ptr<A> p = factory<A>(5); // ! A* q = new A(5); // OK





factory



, "5" factory



, int&



rvalue "5". , , .



: AI



& const AI



&?



, : 4 . 8 . 16 .. .



Rvalue :



template <class T, class A1> std::shared_ptr<T> factory(A1&& a1) { return std::shared_ptr<T>(new T(std::forward<A1>(a1))); }





rvalue factory



. const



, factory



.



: forward



?



move



, forward



- , , , . a1



, .



, forward



lvalue/rvalue , factory



. factory



rvalue, forward



T



rvalue. , lvalue factory



, T



lvalue.



forward



:



template <class T> struct identity { typedef T type; }; template <class T> T&& forward(typename identity<T>::type&& a) { return a; }







, . , 95% .



, , , , N1377 .



N1385 .



rvalue ( ), N1690 .



, rvalue , N1952 .



rvalue , N2027 .



rvalue , N1771 .



, rvalue , :

N1856 N1857 N1858 N1859 N1860 N1861 N1862

rvalue (this), N1821 .




 vector<unique_ptr>,   ,     : 
      



struct indirect_less { template <class T> bool operator()(const T& x, const T& y) {return *x < *y;} }; ... std::vector<std::unique_ptr<A>> v; ... std::sort(v.begin(), v.end(), indirect_less());






unique_ptr



, swap



( , ) / . , , . ( , ), .



(perfect forwarding)

, std::shared_ptr



. . , , . :



template <class T> std::shared_ptr<T> factory() // { return std::shared_ptr<T>(new T); } template <class T, class A1> std::shared_ptr<T> factory(const A1& a1) // { return std::shared_ptr<T>(new T(a1)); } //





. :



std::shared_ptr<A> p = factory<A>(5);





: , T



?



, factory



T



.



factory



:



template <class T, class A1> std::shared_ptr<T> factory(A1& a1) { return std::shared_ptr<T>(new T(a1)); }





. const



factory



, (, A1



) T



. , , T



. (, std::bind



).



:



std::shared_ptr<A> p = factory<A>(5); // ! A* q = new A(5); // OK





factory



, "5" factory



, int&



rvalue "5". , , .



: AI



& const AI



&?



, : 4 . 8 . 16 .. .



Rvalue :



template <class T, class A1> std::shared_ptr<T> factory(A1&& a1) { return std::shared_ptr<T>(new T(std::forward<A1>(a1))); }





rvalue factory



. const



, factory



.



: forward



?



move



, forward



- , , , . a1



, .



, forward



lvalue/rvalue , factory



. factory



rvalue, forward



T



rvalue. , lvalue factory



, T



lvalue.



forward



:



template <class T> struct identity { typedef T type; }; template <class T> T&& forward(typename identity<T>::type&& a) { return a; }







, . , 95% .



, , , , N1377 .



N1385 .



rvalue ( ), N1690 .



, rvalue , N1952 .



rvalue , N2027 .



rvalue , N1771 .



, rvalue , :

N1856 N1857 N1858 N1859 N1860 N1861 N1862

rvalue (this), N1821 .




vector<unique_ptr>, , :



struct indirect_less { template <class T> bool operator()(const T& x, const T& y) {return *x < *y;} }; ... std::vector<std::unique_ptr<A>> v; ... std::sort(v.begin(), v.end(), indirect_less());






unique_ptr



, swap



( , ) / . , , . ( , ), .



(perfect forwarding)

, std::shared_ptr



. . , , . :



template <class T> std::shared_ptr<T> factory() // { return std::shared_ptr<T>(new T); } template <class T, class A1> std::shared_ptr<T> factory(const A1& a1) // { return std::shared_ptr<T>(new T(a1)); } //





. :



std::shared_ptr<A> p = factory<A>(5);





: , T



?



, factory



T



.



factory



:



template <class T, class A1> std::shared_ptr<T> factory(A1& a1) { return std::shared_ptr<T>(new T(a1)); }





. const



factory



, (, A1



) T



. , , T



. (, std::bind



).



:



std::shared_ptr<A> p = factory<A>(5); // ! A* q = new A(5); // OK





factory



, "5" factory



, int&



rvalue "5". , , .



: AI



& const AI



&?



, : 4 . 8 . 16 .. .



Rvalue :



template <class T, class A1> std::shared_ptr<T> factory(A1&& a1) { return std::shared_ptr<T>(new T(std::forward<A1>(a1))); }





rvalue factory



. const



, factory



.



: forward



?



move



, forward



- , , , . a1



, .



, forward



lvalue/rvalue , factory



. factory



rvalue, forward



T



rvalue. , lvalue factory



, T



lvalue.



forward



:



template <class T> struct identity { typedef T type; }; template <class T> T&& forward(typename identity<T>::type&& a) { return a; }







, . , 95% .



, , , , N1377 .



N1385 .



rvalue ( ), N1690 .



, rvalue , N1952 .



rvalue , N2027 .



rvalue , N1771 .



, rvalue , :

N1856 N1857 N1858 N1859 N1860 N1861 N1862

rvalue (this), N1821 .




 vector<unique_ptr>,   ,     : 
      



struct indirect_less { template <class T> bool operator()(const T& x, const T& y) {return *x < *y;} }; ... std::vector<std::unique_ptr<A>> v; ... std::sort(v.begin(), v.end(), indirect_less());






unique_ptr



, swap



( , ) / . , , . ( , ), .



(perfect forwarding)

, std::shared_ptr



. . , , . :



template <class T> std::shared_ptr<T> factory() // { return std::shared_ptr<T>(new T); } template <class T, class A1> std::shared_ptr<T> factory(const A1& a1) // { return std::shared_ptr<T>(new T(a1)); } //





. :



std::shared_ptr<A> p = factory<A>(5);





: , T



?



, factory



T



.



factory



:



template <class T, class A1> std::shared_ptr<T> factory(A1& a1) { return std::shared_ptr<T>(new T(a1)); }





. const



factory



, (, A1



) T



. , , T



. (, std::bind



).



:



std::shared_ptr<A> p = factory<A>(5); // ! A* q = new A(5); // OK





factory



, "5" factory



, int&



rvalue "5". , , .



: AI



& const AI



&?



, : 4 . 8 . 16 .. .



Rvalue :



template <class T, class A1> std::shared_ptr<T> factory(A1&& a1) { return std::shared_ptr<T>(new T(std::forward<A1>(a1))); }





rvalue factory



. const



, factory



.



: forward



?



move



, forward



- , , , . a1



, .



, forward



lvalue/rvalue , factory



. factory



rvalue, forward



T



rvalue. , lvalue factory



, T



lvalue.



forward



:



template <class T> struct identity { typedef T type; }; template <class T> T&& forward(typename identity<T>::type&& a) { return a; }







, . , 95% .



, , , , N1377 .



N1385 .



rvalue ( ), N1690 .



, rvalue , N1952 .



rvalue , N2027 .



rvalue , N1771 .



, rvalue , :

N1856 N1857 N1858 N1859 N1860 N1861 N1862

rvalue (this), N1821 .




vector<unique_ptr>, , :



struct indirect_less { template <class T> bool operator()(const T& x, const T& y) {return *x < *y;} }; ... std::vector<std::unique_ptr<A>> v; ... std::sort(v.begin(), v.end(), indirect_less());






unique_ptr



, swap



( , ) / . , , . ( , ), .



(perfect forwarding)

, std::shared_ptr



. . , , . :



template <class T> std::shared_ptr<T> factory() // { return std::shared_ptr<T>(new T); } template <class T, class A1> std::shared_ptr<T> factory(const A1& a1) // { return std::shared_ptr<T>(new T(a1)); } //





. :



std::shared_ptr<A> p = factory<A>(5);





: , T



?



, factory



T



.



factory



:



template <class T, class A1> std::shared_ptr<T> factory(A1& a1) { return std::shared_ptr<T>(new T(a1)); }





. const



factory



, (, A1



) T



. , , T



. (, std::bind



).



:



std::shared_ptr<A> p = factory<A>(5); // ! A* q = new A(5); // OK





factory



, "5" factory



, int&



rvalue "5". , , .



: AI



& const AI



&?



, : 4 . 8 . 16 .. .



Rvalue :



template <class T, class A1> std::shared_ptr<T> factory(A1&& a1) { return std::shared_ptr<T>(new T(std::forward<A1>(a1))); }





rvalue factory



. const



, factory



.



: forward



?



move



, forward



- , , , . a1



, .



, forward



lvalue/rvalue , factory



. factory



rvalue, forward



T



rvalue. , lvalue factory



, T



lvalue.



forward



:



template <class T> struct identity { typedef T type; }; template <class T> T&& forward(typename identity<T>::type&& a) { return a; }







, . , 95% .



, , , , N1377 .



N1385 .



rvalue ( ), N1690 .



, rvalue , N1952 .



rvalue , N2027 .



rvalue , N1771 .



, rvalue , :

N1856 N1857 N1858 N1859 N1860 N1861 N1862

rvalue (this), N1821 .




 vector<unique_ptr>,   ,     : 
      



struct indirect_less { template <class T> bool operator()(const T& x, const T& y) {return *x < *y;} }; ... std::vector<std::unique_ptr<A>> v; ... std::sort(v.begin(), v.end(), indirect_less());






unique_ptr



, swap



( , ) / . , , . ( , ), .



(perfect forwarding)

, std::shared_ptr



. . , , . :



template <class T> std::shared_ptr<T> factory() // { return std::shared_ptr<T>(new T); } template <class T, class A1> std::shared_ptr<T> factory(const A1& a1) // { return std::shared_ptr<T>(new T(a1)); } //





. :



std::shared_ptr<A> p = factory<A>(5);





: , T



?



, factory



T



.



factory



:



template <class T, class A1> std::shared_ptr<T> factory(A1& a1) { return std::shared_ptr<T>(new T(a1)); }





. const



factory



, (, A1



) T



. , , T



. (, std::bind



).



:



std::shared_ptr<A> p = factory<A>(5); // ! A* q = new A(5); // OK





factory



, "5" factory



, int&



rvalue "5". , , .



: AI



& const AI



&?



, : 4 . 8 . 16 .. .



Rvalue :



template <class T, class A1> std::shared_ptr<T> factory(A1&& a1) { return std::shared_ptr<T>(new T(std::forward<A1>(a1))); }





rvalue factory



. const



, factory



.



: forward



?



move



, forward



- , , , . a1



, .



, forward



lvalue/rvalue , factory



. factory



rvalue, forward



T



rvalue. , lvalue factory



, T



lvalue.



forward



:



template <class T> struct identity { typedef T type; }; template <class T> T&& forward(typename identity<T>::type&& a) { return a; }







, . , 95% .



, , , , N1377 .



N1385 .



rvalue ( ), N1690 .



, rvalue , N1952 .



rvalue , N2027 .



rvalue , N1771 .



, rvalue , :

N1856 N1857 N1858 N1859 N1860 N1861 N1862

rvalue (this), N1821 .




vector<unique_ptr>, , :



struct indirect_less { template <class T> bool operator()(const T& x, const T& y) {return *x < *y;} }; ... std::vector<std::unique_ptr<A>> v; ... std::sort(v.begin(), v.end(), indirect_less());






unique_ptr



, swap



( , ) / . , , . ( , ), .



(perfect forwarding)

, std::shared_ptr



. . , , . :



template <class T> std::shared_ptr<T> factory() // { return std::shared_ptr<T>(new T); } template <class T, class A1> std::shared_ptr<T> factory(const A1& a1) // { return std::shared_ptr<T>(new T(a1)); } //





. :



std::shared_ptr<A> p = factory<A>(5);





: , T



?



, factory



T



.



factory



:



template <class T, class A1> std::shared_ptr<T> factory(A1& a1) { return std::shared_ptr<T>(new T(a1)); }





. const



factory



, (, A1



) T



. , , T



. (, std::bind



).



:



std::shared_ptr<A> p = factory<A>(5); // ! A* q = new A(5); // OK





factory



, "5" factory



, int&



rvalue "5". , , .



: AI



& const AI



&?



, : 4 . 8 . 16 .. .



Rvalue :



template <class T, class A1> std::shared_ptr<T> factory(A1&& a1) { return std::shared_ptr<T>(new T(std::forward<A1>(a1))); }





rvalue factory



. const



, factory



.



: forward



?



move



, forward



- , , , . a1



, .



, forward



lvalue/rvalue , factory



. factory



rvalue, forward



T



rvalue. , lvalue factory



, T



lvalue.



forward



:



template <class T> struct identity { typedef T type; }; template <class T> T&& forward(typename identity<T>::type&& a) { return a; }







, . , 95% .



, , , , N1377 .



N1385 .



rvalue ( ), N1690 .



, rvalue , N1952 .



rvalue , N2027 .



rvalue , N1771 .



, rvalue , :

N1856 N1857 N1858 N1859 N1860 N1861 N1862

rvalue (this), N1821 .




vector<unique_ptr>, , :



struct indirect_less { template <class T> bool operator()(const T& x, const T& y) {return *x < *y;} }; ... std::vector<std::unique_ptr<A>> v; ... std::sort(v.begin(), v.end(), indirect_less());






unique_ptr



, swap



( , ) / . , , . ( , ), .



(perfect forwarding)

, std::shared_ptr



. . , , . :



template <class T> std::shared_ptr<T> factory() // { return std::shared_ptr<T>(new T); } template <class T, class A1> std::shared_ptr<T> factory(const A1& a1) // { return std::shared_ptr<T>(new T(a1)); } //





. :



std::shared_ptr<A> p = factory<A>(5);





: , T



?



, factory



T



.



factory



:



template <class T, class A1> std::shared_ptr<T> factory(A1& a1) { return std::shared_ptr<T>(new T(a1)); }





. const



factory



, (, A1



) T



. , , T



. (, std::bind



).



:



std::shared_ptr<A> p = factory<A>(5); // ! A* q = new A(5); // OK





factory



, "5" factory



, int&



rvalue "5". , , .



: AI



& const AI



&?



, : 4 . 8 . 16 .. .



Rvalue :



template <class T, class A1> std::shared_ptr<T> factory(A1&& a1) { return std::shared_ptr<T>(new T(std::forward<A1>(a1))); }





rvalue factory



. const



, factory



.



: forward



?



move



, forward



- , , , . a1



, .



, forward



lvalue/rvalue , factory



. factory



rvalue, forward



T



rvalue. , lvalue factory



, T



lvalue.



forward



:



template <class T> struct identity { typedef T type; }; template <class T> T&& forward(typename identity<T>::type&& a) { return a; }







, . , 95% .



, , , , N1377 .



N1385 .



rvalue ( ), N1690 .



, rvalue , N1952 .



rvalue , N2027 .



rvalue , N1771 .



, rvalue , :

N1856 N1857 N1858 N1859 N1860 N1861 N1862

rvalue (this), N1821 .




vector<unique_ptr>, , :



struct indirect_less { template <class T> bool operator()(const T& x, const T& y) {return *x < *y;} }; ... std::vector<std::unique_ptr<A>> v; ... std::sort(v.begin(), v.end(), indirect_less());






unique_ptr



, swap



( , ) / . , , . ( , ), .



(perfect forwarding)

, std::shared_ptr



. . , , . :



template <class T> std::shared_ptr<T> factory() // { return std::shared_ptr<T>(new T); } template <class T, class A1> std::shared_ptr<T> factory(const A1& a1) // { return std::shared_ptr<T>(new T(a1)); } //





. :



std::shared_ptr<A> p = factory<A>(5);





: , T



?



, factory



T



.



factory



:



template <class T, class A1> std::shared_ptr<T> factory(A1& a1) { return std::shared_ptr<T>(new T(a1)); }





. const



factory



, (, A1



) T



. , , T



. (, std::bind



).



:



std::shared_ptr<A> p = factory<A>(5); // ! A* q = new A(5); // OK





factory



, "5" factory



, int&



rvalue "5". , , .



: AI



& const AI



&?



, : 4 . 8 . 16 .. .



Rvalue :



template <class T, class A1> std::shared_ptr<T> factory(A1&& a1) { return std::shared_ptr<T>(new T(std::forward<A1>(a1))); }





rvalue factory



. const



, factory



.



: forward



?



move



, forward



- , , , . a1



, .



, forward



lvalue/rvalue , factory



. factory



rvalue, forward



T



rvalue. , lvalue factory



, T



lvalue.



forward



:



template <class T> struct identity { typedef T type; }; template <class T> T&& forward(typename identity<T>::type&& a) { return a; }







, . , 95% .



, , , , N1377 .



N1385 .



rvalue ( ), N1690 .



, rvalue , N1952 .



rvalue , N2027 .



rvalue , N1771 .



, rvalue , :

N1856 N1857 N1858 N1859 N1860 N1861 N1862

rvalue (this), N1821 .




vector<unique_ptr>, , :



struct indirect_less { template <class T> bool operator()(const T& x, const T& y) {return *x < *y;} }; ... std::vector<std::unique_ptr<A>> v; ... std::sort(v.begin(), v.end(), indirect_less());






unique_ptr



, swap



( , ) / . , , . ( , ), .



(perfect forwarding)

, std::shared_ptr



. . , , . :



template <class T> std::shared_ptr<T> factory() // { return std::shared_ptr<T>(new T); } template <class T, class A1> std::shared_ptr<T> factory(const A1& a1) // { return std::shared_ptr<T>(new T(a1)); } //





. :



std::shared_ptr<A> p = factory<A>(5);





: , T



?



, factory



T



.



factory



:



template <class T, class A1> std::shared_ptr<T> factory(A1& a1) { return std::shared_ptr<T>(new T(a1)); }





. const



factory



, (, A1



) T



. , , T



. (, std::bind



).



:



std::shared_ptr<A> p = factory<A>(5); // ! A* q = new A(5); // OK





factory



, "5" factory



, int&



rvalue "5". , , .



: AI



& const AI



&?



, : 4 . 8 . 16 .. .



Rvalue :



template <class T, class A1> std::shared_ptr<T> factory(A1&& a1) { return std::shared_ptr<T>(new T(std::forward<A1>(a1))); }





rvalue factory



. const



, factory



.



: forward



?



move



, forward



- , , , . a1



, .



, forward



lvalue/rvalue , factory



. factory



rvalue, forward



T



rvalue. , lvalue factory



, T



lvalue.



forward



:



template <class T> struct identity { typedef T type; }; template <class T> T&& forward(typename identity<T>::type&& a) { return a; }







, . , 95% .



, , , , N1377 .



N1385 .



rvalue ( ), N1690 .



, rvalue , N1952 .



rvalue , N2027 .



rvalue , N1771 .



, rvalue , :

N1856 N1857 N1858 N1859 N1860 N1861 N1862

rvalue (this), N1821 .







All Articles