рд░реЗрдлрд░реА-рдпреЛрдЧреНрдп рд╕рджрд╕реНрдп рдХрд╛рд░реНрдп

рдЗрд╕ рдкреЛрд╕реНрдЯ рдореЗрдВ рдореИрдВ рдПрдХ рдирдП рдФрд░ (рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рд▓рдЧрддрд╛ рд╣реИ) рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░реВрдВрдЧрд╛ C ++ рдХреА рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рдХрдо рдЬреНрдЮрд╛рдд рд╡рд┐рд╢реЗрд╖рддрд╛ - рд╕рдВрджрд░реНрдн-рдпреЛрдЧреНрдп рд╕рджрд╕реНрдп рдлрд╝рдВрдХреНрд╢рди ред рдореИрдВ рдЖрдкрдХреЛ рдРрд╕реЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдУрд╡рд░рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рдирд┐рдпрдореЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрддрд╛рдКрдВрдЧрд╛, рдФрд░ рдЙрдкрдпреЛрдЧ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ, рдореИрдВ рдЖрдкрдХреЛ рдмрддрд╛рдКрдВрдЧрд╛ рдХрд┐ рдХреИрд╕реЗ рдПрдХ рдФрд░ C ++ рдореБрд╣рд╛рд╡рд░реЗ - RAII рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рд╕рдВрд╕рд╛рдзрди рдкреНрд░рдмрдВрдзрди рдпреЛрдЬрдирд╛ рдХреЛ рдмреЗрд╣рддрд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП Ref-Qualifie d рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПред

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


рдЗрд╕рд▓рд┐рдП, рд╣рд╛рд▓ рд╣реА рдореЗрдВ, рд╕реА ++ рдореЗрдВ, рд▓рд┐рдВрдХ рдХреЗ рд╕рд╛рде рд╕рджрд╕реНрдп рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдЕрд░реНрд╣рддрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реЛ рдЧрдпрд╛ рд╣реИ (рдХрдо рд╕реЗ рдХрдо рдЙрдкрд╕реНрдерд┐рддрд┐ рдореЗрдВ рдпрд╣ рд▓рд┐рдВрдХ рдХреА рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ)ред рдЗрди рдпреЛрдЧреНрдпрддрд╛ рдЕрдВрдХреЛрдВ рдХреЛ рд▓рдВрдмрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд╕рдВрджрд░реНрдн рдХреЗ рд╕рдВрджрд░реНрднреЛрдВ рдХреЛ, рдпреЛрдЧреНрдпрддрд╛ рдпреЛрдЧреНрдпрддрд╛ рдХреЗ рд╕рд╛рде рдЬреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

class some_type { void foo() & ; void foo() && ; void foo() const & ; void foo() const && ; }; 


рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рд╣реИ?


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

 int main() { some_type t; t.foo(); // some_type::foo() & some_type().foo(); // some_type::foo() && } 


рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ?


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

 struct some_type { bool operator == (int) const; }; bool operator == (const some_type& l, long r); void g() { some_type t; int i = 42; t == i; //   ? } 


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

 class some_type { void foo() & ; // 1 void foo() && ; // 2 void foo() const & ; // 3 void foo() const && ; // 4 }; void g() { some_type().foo(); } 


рдЗрд╕ рдХреЙрд▓ рдХреЗ рд▓рд┐рдП, 3 рдЙрдореНрдореАрджрд╡рд╛рд░ рдЙрдкрдпреБрдХреНрдд рд╣реИрдВ: 2, 3, рдФрд░ 4. рдЙрдирдХреЗ рдмреАрдЪ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдорд╛рдирдХ рдореЗрдВ рд╡рд┐рд╢реЗрд╖ рдирд┐рдпрдо рд╣реИрдВ рдЬреЛ рдХрд╛рдЧрдЬ рдкрд░ рдХреНрд░рд┐рдпрд╛ рдФрд░ рдЬрдЯрд┐рд▓ рджрд┐рдЦрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЗрд╕рдХрд╛ рд╕рд╛рд░ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЪрдпрди рдХрд░рдирд╛ рд╣реИ рдЬреЛ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдкреНрд░рдХрд╛рд░ рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИред
рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВ рдХрд▓реНрдкрдирд╛ рдХрд░рддрд╛ рд╣реВрдВ, рдореИрдВ рдЙрдореНрдореАрджрд╡рд╛рд░ рдХреЗ рдирд┐рд╖реНрдХрд░реНрд╖ рдкрд░ рддрд░реНрдХ рдХреА рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реВрдВрдЧрд╛ред рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ some_type () рдПрдХ рдкреНрд░рддрд┐рджреНрд╡рдВрджреНрд╡рд┐рддрд╛ рд╣реИ ред рд╕рдВрднрд╛рд╡рд┐рдд рд░реВрдк рд╕реЗ, рдлрд╝рдВрдХреНрд╢рдВрд╕ 2, 3, рдпрд╛ 4 рдХреЛ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рд░реЗрд╡рд▓реНрдпреВ рд░реЗрдлрд░реЗрдВрд╕ рдХреНрд╡рд╛рд▓рд┐рдлрд╛рдЗрдб рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреЙрдиреНрд╕реНрдЯреЗрдВрдЯ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдореВрд▓ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ (рд░рд┐рд╡реЗрд▓реНрдпреВ) рдХреЗ рдкреНрд░рдХрд╛рд░ рд╕реЗ рдЕрдзрд┐рдХ "рдорд┐рд▓рд╛рди" рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рд╡рд┐рдХрд▓реНрдк 2 рдФрд░ 4 рдмрдиреЗ рд░рд╣реЗрдВред рдЪреМрдереЗ рдЕрд╡рддрд╛рд░ рдореЗрдВ, рдкреВрд░реНрдг рдкрддреНрд░рд╛рдЪрд╛рд░ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдореВрд▓ рдкреНрд░рдХрд╛рд░ рдкрд░ рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ - рдХрд╛рд╕реНрдЯ рдЬреЛрдбрд╝реЗрдВ, рдЬрдмрдХрд┐ рджреВрд╕рд░реЗ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рдХреЛрдИ рдЕрддрд┐рд░рд┐рдХреНрдд рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдЕрдВрдд рдореЗрдВ, рд╡рд┐рдХрд▓реНрдк 2 рдХрд╛ рдЪрдпрди рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рдХреИрд╕реЗ рдХрд░реЗрдВ рдЗрд╕реНрддреЗрдорд╛рд▓?


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

 class file_wrapper { public: // ... operator FILE* () {return held_;} ~file_wrapper() {fclose(held_);} private: FILE* held_; }; 


рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдСрдкрд░реЗрдЯрд░ рдлрд╝рд╛рдЗрд▓ * () рдлрд╝рд╛рдЗрд▓ рдЖрд╡рд░рдг рдХреЗ рд╕реБрд░рдХреНрд╖рд┐рдд рдЙрдкрдпреЛрдЧ рдореЗрдВ рдПрдХ рд╡рд┐рд╢рд╛рд▓ рдЫреЗрдж рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддрд╛ рд╣реИред
рдЙрдкрдпреЛрдЧ рдХреЗ рдЗрд╕ рд╕рдВрджрд░реНрдн рдХреА рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ:

 FILE* f = file_wrapper("some_file.txt", "r"); //   f 


рдЕрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЗрд╕реЗ рдмрдирд╛рдиреЗ рдХрд╛ рдЕрд╡рд╕рд░ рд╣реИ, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдмрд╣реБрдд рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ, рдХрд╛рд░реНрдп рдЕрдзрд┐рдХ (рд▓реЗрдХрд┐рди рдкреВрд░реА рддрд░рд╣ рд╕реЗ) рд╕реБрд░рдХреНрд╖рд┐рдд рдирд╣реАрдВ рд╣реИред

 operator FILE* () & {return held_;} //     lvalue  


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

 template <typename T> class some_type { public: operator std::unique_ptr<T>() const & { return std::unique_ptr<T>(new T(*held_)); //  } operator std::unique_ptr<T>() && { return std::move(held_); //   } private: std::unique_ptr<T> held_; }; some_type f(); void g() { std::unique_ptr<widget> p = f(); } 

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


All Articles