рд░реЗрд╡рд▓реНрдпреВ рд╕рдВрджрд░реНрдн 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
?)
рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдХрд┐рд╕реА рднреА рдХрд╛рд░реНрдп рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдирд┐рд░реНрдорд╛рддрд╛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдкреНрд░рддрд┐рджреНрд╡рдВрджреНрд╡рд┐рддрд╛ рдХреЗ рд╕рд╛рде рдирдХрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╖реНрдЯрддрдо рд╣реИред
рдЬрдВрдЧрдо рд▓реЗрдХрд┐рди рдирдХрд▓ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдкреНрд░рдХрд╛рд░ рдирд╣реАрдВ
рдХреБрдЫ рдкреНрд░рдХрд╛рд░ рдХреА рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдХреЗ рд▓рд┐рдП рд╢рдмреНрджрд╛рд░реНрде рд▓рд╛рдЧреВ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЙрдиреНрд╣реЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:
-
fstream
-
unique_ptr
(рдЧреИрд░-рд╕рд╛рдЭрд╛ рдФрд░ рдЧреИрд░-рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдпреЛрдЧреНрдп рд╕реНрд╡рд╛рдорд┐рддреНрд╡) - рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рдПрдХ рдзрд╛рдЧреЗ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдкреНрд░рдХрд╛рд░
рдпрджрд┐ рдРрд╕реЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдЪрд▓ (рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╡реЗ рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдирд╣реАрдВ рдмрдиреЗ рд░рд╣рддреЗ) рдмрдирд╛рдП рдЬрд╛рддреЗ рд╣реИрдВ, рддреЛ рдЙрдирдХреА рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдмрд╣реБрдд рдмрдврд╝ рдЬрд╛рддреА рд╣реИред рдПрдХ рдЪрд▓ рд▓реЗрдХрд┐рди рдХреЙрдкреА рдХреА рдЧрдИ рд╡рд╕реНрддреБ рдХреЛ рдлреИрдХреНрдЯреНрд░реА рд╡рд┐рдзрд┐ (рдкреИрдЯрд░реНрди) рд╕реЗ рдореВрд▓реНрдп рджреНрд╡рд╛рд░рд╛ рд╡рд╛рдкрд╕ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
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 .
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))); }
rvaluefactory
.const
,factory
.
:forward
?
move
,forward
- , , , .a1
, .
,forward
lvalue/rvalue ,factory
.factory
rvalue,forward
T
rvalue. , lvaluefactory
,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))); }
rvaluefactory
.const
,factory
.
:forward
?
move
,forward
- , , , .a1
, .
,forward
lvalue/rvalue ,factory
.factory
rvalue,forward
T
rvalue. , lvaluefactory
,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))); }
rvaluefactory
.const
,factory
.
:forward
?
move
,forward
- , , , .a1
, .
,forward
lvalue/rvalue ,factory
.factory
rvalue,forward
T
rvalue. , lvaluefactory
,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))); }
rvaluefactory
.const
,factory
.
:forward
?
move
,forward
- , , , .a1
, .
,forward
lvalue/rvalue ,factory
.factory
rvalue,forward
T
rvalue. , lvaluefactory
,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))); }
rvaluefactory
.const
,factory
.
:forward
?
move
,forward
- , , , .a1
, .
,forward
lvalue/rvalue ,factory
.factory
rvalue,forward
T
rvalue. , lvaluefactory
,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))); }
rvaluefactory
.const
,factory
.
:forward
?
move
,forward
- , , , .a1
, .
,forward
lvalue/rvalue ,factory
.factory
rvalue,forward
T
rvalue. , lvaluefactory
,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))); }
rvaluefactory
.const
,factory
.
:forward
?
move
,forward
- , , , .a1
, .
,forward
lvalue/rvalue ,factory
.factory
rvalue,forward
T
rvalue. , lvaluefactory
,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 .