C ++: рдЬрдм рдХрд┐рд╕реА рд╡рд╕реНрддреБ рдХрд╛ рдЬреАрд╡рдирдХрд╛рд▓ рдЙрд╕рдХреЗ рд╕рдВрджрд░реНрдн рдХреЗ рдЬреАрд╡рдирдХрд╛рд▓ рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ

рдЙрд╕ рд╕рдордп, рдЬрдм рд▓реЗрдЦ r- рдореВрд▓реНрдп рд▓рд┐рдВрдХ рдХреА рдкреНрд░рдХреГрддрд┐ рдФрд░ рдиреБрдХрд╕рд╛рди рдкрд░ рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд┐рдП рдЬрд╛ рд░рд╣реЗ рдереЗ (рдЙрдкрдпреЛрдЧреА рд╕реНрд░реЛрддреЛрдВ рдХреЗ рд▓рд┐рдВрдХ рдХреЗ рд╕рд╛рде рдПрдХ рдЙрджрд╛рд╣рд░рдг habrahabr.ru/post/157961 ), рдореБрдЭреЗ рд╕рдВрджреЗрд╣ рд╣реИ рдХрд┐ рдХрд╛рдлреА рдХреБрдЫ рд╕рд╛рдзрд╛рд░рдг рдПрд▓-рдореВрд▓реНрдп рд▓рд┐рдВрдХ рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЛ рдирд╣реАрдВ рдЬрд╛рдирддреЗ рд╣реИрдВред рдЗрд╕ рд▓реЗрдЦ рдХрд╛ рд╕рд╛рд░ рдПрдХ рдЙрджрд╛рд╣рд░рдг рджрд┐рдЦрд╛рдирд╛ рд╣реИ рдЬрдм рдХрд┐рд╕реА рд╡рд╕реНрддреБ рдХрд╛ рдЬреАрд╡рдирдХрд╛рд▓ рдЙрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдПрд▓-рдореВрд▓реНрдп рд╕рдВрджрд░реНрдн рдХреЗ рдЬреАрд╡рдирдХрд╛рд▓ рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЕрдЧрд░ рджрд┐рд▓рдЪрд╕реНрдкреА рд╣реИ, рддреЛ рд╕реНрд╡рд╛рдЧрдд рд╣реИред рд╡реИрд╕реЗ, рдПрд▓-рд╡реИрд▓реНрдпреВ рд▓рд┐рдВрдХ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рд╕реЗ рдЕрдзрд┐рдХ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЛ рдЬрд╛рдирдирд╛, рдЖрд░-рдореВрд▓реНрдп рдХреЛ рд╕рдордЭрдирд╛ рдЖрд╕рд╛рди рд╣реЛрдЧрд╛ред

рд╣рдо рдпрд╣ рдорд╛рди рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╣рд░ рдХреЛрдИ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдкрдбрд╝рдиреЗ рдкрд░ рдПрдХ рд╕реНрдерд┐рд░ рд▓рд┐рдВрдХ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╡рд╕реНрддреБрдУрдВ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рд╡реЗ рд╡рд╕реНрддреБ рдХреЗ рдЬреАрд╡рдирдХрд╛рд▓ рдХреЛ рдХрд╛рдлреА рд╕рдЯреАрдХ рд░реВрдк рд╕реЗ рдЬрд╛рдирддреЗ рд╣реИрдВред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:
struct S{}; void f(const S& value){} f(S()); 

рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рд╣рдо рдорд╛рди рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдлрд╝рдВрдХреНрд╢рди S () рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдСрдмреНрдЬреЗрдХреНрдЯ S () рдзреНрд╡рд╕реНрдд рд╣реЛрдирд╛ рд╢реБрд░реВ рд╣реЛ рдЬрд╛рдПрдЧрд╛ред рдпрд╣ рдмрд╣реБрдд рд╕рдЯреАрдХ рдХреНрдпреЛрдВ рд╣реИ? - рдХреНрдпреЛрдВрдХрд┐, q(A(), B()); рд╕реГрдЬрди рдХрд╛ рдХреНрд░рдо рдФрд░, рддрджрдиреБрд╕рд╛рд░, рдП рдФрд░ рдмреА рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдирд╖реНрдЯ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣рд░ рдХреЛрдИ рдЬрд╛рдирддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдирд╣реАрдВ рд▓рд┐рдЦ рд╕рдХрддреЗ
 int& r = 1; //   

рдФрд░ рдЕрдм рдордЬрд╝реЗрджрд╛рд░ рд╣рд┐рд╕реНрд╕реЗ рдХреЗ рд▓рд┐рдПред
рд▓реЗрдХрд┐рди рдЖрдк рдРрд╕рд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
 const int& r = 1; 
рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдорд╛рдирдХ рдФрд░ рд╕реНрдЯреНрд░реЗрдиреНрд╕реЗрдк рдХреЗ рдЕрдиреБрд╕рд╛рд░ (7.7.1)
рдпрд╛рдиреА рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЙрджрд╛рд╣рд░рдг рдореЗрдВ
 struct Obj { Obj(int i) : m_i(i) { cout << "ctr: " << m_i << endl; } ~Obj() { cout << "dtr: " << m_i << endl; } Obj operator+(const Obj& value) { return Obj(m_i + value.m_i); } int m_i; }; ... Obj o1(1); const Obj& ro2 = Obj(2) + Obj(3); Obj o6(6); 

рдЖрдЙрдЯрдкреБрдЯ (msvs 2012):
 ctr: 1 ctr: 3 ctr: 2 ctr: 5 dtr: 2 dtr: 3 ctr: 6 dtr: 6 dtr: 5 dtr: 1 

рд▓реЗрдХрд┐рди рдпрд╣ рд╕рдм рдирд╣реАрдВ рд╣реИред рд╣рд░ рдХреЛрдИ рдпрд╣ рднреА рдЬрд╛рдирддрд╛ рд╣реИ рдХрд┐ рдЖрднрд╛рд╕реА рд╡рд┐рдзреНрд╡рдВрд╕рдХ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдЗрдП рдирд┐рдореНрди рдЙрджрд╛рд╣рд░рдг рджреЗрдЦреЗрдВ рдЬрдм рдЖрдзрд╛рд░ рд╡рд░реНрдЧ рдореЗрдВ рдЧреИрд░-рдЖрднрд╛рд╕реА рд╡рд┐рдзреНрд╡рдВрд╕рдХ рд╣реЛрддрд╛ рд╣реИред рд╣рдо рдЕрдкрдиреЗ Obj рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдФрд░ рдЬреЛрдбрд╝рдирд╛ рдЬрд╛рд░реА рд░рдЦрддреЗ рд╣реИрдВ
 struct D : Obj { D(int i) : Obj(i) { cout << "D::ctr: " << m_i << endl; } ~D() { cout << "D::dtr: " << m_i << endl; } }; Obj o1(1); const Obj& ro2 = D(5); Obj o6(6); 
рдирд┐рд╖реНрдХрд░реНрд╖:
 ctr: 1 ctr: 5 D::ctr: 5 ctr: 6 dtr: 6 D::dtr: 5 dtr: 5 dtr: 1 
рдпрд╛рдиреА рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЗрд╕ рддрдереНрдп рдХреЗ рдмрд╛рд╡рдЬреВрдж рдХрд┐ рдирд┐рд░рдВрддрд░ рд╕рдВрджрд░реНрдн рдХрд╛ рдкреНрд░рдХрд╛рд░ const Obj& , рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╣рдорд╛рд░реА рд╡рд╕реНрддреБ D "рдЬреАрд╡рди" рд╣реИ, рдЬрдмрдХрд┐ "рд╕рдВрджрд░реНрдн" рдпрд╣ "рдЬреАрд╡рди" рд╣реИред

рдлрд┐рд░ рд╕рд╡рд╛рд▓ рдЙрдарддрд╛ рд╣реИ: "рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдЙрдкрдпреЛрдЧ рдХреНрдпрд╛ рд╣реИ?" рдПрдХ рдЙрддреНрддрд░ рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА ScopeGuard рджреГрд╖реНрдЯрд┐рдХреЛрдг ( http://www.drdobbs.com/cpp/generic-change-the-way-you-write-excepti/184403758?pgno-2 ) рдореЗрдВ рд▓рд╛рдЧреВ рд╣реИред рдореИрдВ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ рдФрд░ рд╕рдВрдмрдВрдзрд┐рдд рд╡рд┐рдзреНрд╡рдВрд╕рдХ рдФрд░ рдирд┐рд░реНрдорд╛рдгрдХрд░реНрддрд╛ рдХреЗ рд╕рд╛рде рдПрдХ рд╡рд░реНрдЧ рдореЗрдВ рд╡рд╛рдВрдЫрд┐рдд рд╕рдВрд╕рд╛рдзрди рд╕рдВрднрд╛рд▓ рд▓рдкреЗрдЯреВрдВрдЧрд╛ред

рдЦреИрд░, рдЫрд╛рдкреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ, рдФрд░ рдЕрдм рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдкреНрд░рдХрд╛рд░ рдХреЗ рд░реВрдкрд╛рдВрддрд░рдг рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдпрд╛рдж рд░рдЦреЗрдВ, рдЬрдм рдирд┐рд░реНрдорд╛рдгрдХрд░реНрддрд╛ рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдШреЛрд╖рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЯреЗрдореНрдкрд▓реЗрдЯ рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рдкреНрд░рдХрд╛рд░ рдФрд░ рдкреЛрд╕реНрдЯ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рд▓реЗрдЦред

рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдЗрд╕ рд▓реЗрдЦ рдиреЗ рдХрд┐рд╕реА рдФрд░ рдХреЗ рд▓рд┐рдП рдПрдХ рдФрд░ C ++ рд╕реБрд╡рд┐рдзрд╛ рдЦреЛрд▓ рджреА рд╣реИред

рдкрд░рд┐рд╢рд┐рд╖реНрдЯ рдФрд░ рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБред

рдЙрди рд▓реЛрдЧреЛрдВ рдХреЛ рдмрдЪрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЬреЛ рдорд╛рдирдХ рдореЗрдВ рдирд╣реАрдВ рдЖрддреЗ рд╣реИрдВ рдФрд░ рд╕рд┐рд░реНрдл рд╕реА ++ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ, рдореИрдВ рдЖрдкрдХреЛ рдпрд╛рдж рджрд┐рд▓рд╛рддрд╛ рд╣реВрдВ рдХрд┐ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ
 const Obj& f() {return Obj();} 
рдлрд╝рдВрдХреНрд╢рди рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЕрд╕реНрдерд╛рдпреА рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдирд╖реНрдЯ рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдФрд░ рд▓реМрдЯрд╛ рд▓рд┐рдВрдХ рдереЛрдбрд╝рд╛ рд╕рд╛ рд╣реЛрдЧрд╛ред рдХрд┐рд╕реА рд╡рд╕реНрддреБ рдХрд╛ рдЬреАрд╡рдирдХрд╛рд▓ рдХреЗрд╡рд▓ рд╕реНрдерд╛рдиреАрдп рд▓рд┐рдВрдХ рд╕реЗ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рд╣реЛрддрд╛ рд╣реИред рдорд╛рдирдХ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рд╕реНрдкрд╖реНрдЯ рдФрд░ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдХрд╣рдирд╛ рдЕрдзрд┐рдХ рдХрдард┐рди рд╣реЛрдЧрд╛, рдЕрдЧрд░ рдпрд╣ рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ, рддреЛ рдкреИрд░рд╛рдЧреНрд░рд╛рдл 12.2 рд╕реЗ рд╢реБрд░реВ рдХрд░реЗрдВред рдпрд╣рд╛рдБ рдорд╛рдирдХ рд╕реЗ рдПрдХ рдЙрджреНрдзрд░рдг рд╣реИ (рдЬреЛ рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рдмрдЧрд┐рд▓ рдФрд░ рдордВрдЪреЛрдВ рдореЗрдВ рдХрд╛рдлреА рд╕рд╛рдорд╛рдиреНрдп рд╣реИ):
рджреВрд╕рд░рд╛ рд╕рдВрджрд░реНрдн рддрдм рд╣реЛрддрд╛ рд╣реИ рдЬрдм рдПрдХ рд╕рдВрджрд░реНрдн рдЕрд╕реНрдерд╛рдпреА рдХреЗ рд▓рд┐рдП рдмрд╛рдзреНрдп рд╣реЛрддрд╛ рд╣реИред рдЕрд╕реНрдерд╛рдпреА рдЬрд┐рд╕реЗ рд╕рдВрджрд░реНрдн рдмрд╛рдзреНрдп рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдпрд╛ рдЕрд╕реНрдерд╛рдпреА рд╣реИ рдЬреЛ рдПрдХ рдЙрдк-рд╡рд┐рд╖рдп рдХреЗ рд▓рд┐рдП рдкреВрд░реА рд╡рд╕реНрддреБ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдЕрд╕реНрдерд╛рдпреА рдмрд╛рдзреНрдп рд╣реИ рд╕рдВрджрд░реНрдн рдХреЗ рдЬреАрд╡рдирдХрд╛рд▓ рдХреЗ рд▓рд┐рдП рдиреАрдЪреЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдмрдиреА рд░рд╣рддреА рд╣реИред рдПрдХ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЗ ctor-initializer (12.6.2) рдореЗрдВ рдПрдХ рд╕рдВрджрд░реНрдн рд╕рджрд╕реНрдп рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд╕реНрдерд╛рдпреА рдмрд╛рдзреНрдп, рдЬрдм рддрдХ рдХрд┐ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдмрд╛рд╣рд░ рдирд╣реАрдВ рдирд┐рдХрд▓рддрд╛ рд╣реИред рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ (5.2.2) рдореЗрдВ рд╕рдВрджрд░реНрдн рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд╕реНрдерд╛рдпреА рдмрд╛рдзреНрдп рдХреЙрд▓ рдХреЛ рдкреВрд░реНрдг рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗ рдкреВрд░рд╛ рд╣реЛрдиреЗ рддрдХ рдмрдиреА рд░рд╣рддреА рд╣реИред


рд▓реЗрдЦ рдХреЗ рд▓реЗрдЦрди рдХреЗ рджреМрд░рд╛рди, рдореИрдВ рдПрдЪред рд╕реИрдЯрд░ http://herbsutter.com/2008/01/01/gotw-88-a-candidate-for-the-most-important-const/ рджреНрд╡рд╛рд░рд╛ рдПрдХ рд▓реЗрдЦ рднрд░ рдЖрдпрд╛ред
рд╕рд╛рде рд╣реА рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рдЙрджрд╛рд╣рд░рдг http://www.rsdn.ru/forum/cpp/4257549.flat
 #include <iostream> struct foo { ~foo() { std::cout << "~foo()\n"; } }; struct foo_holder { const foo &f; }; int main() { foo_holder holder = { foo() }; std::cout << "done!\n"; return 0; } 
рдореЗрд░рд╛ рд╕реБрдЭрд╛рд╡ рд╣реИ рдХрд┐ рдирд┐рд╖реНрдХрд░реНрд╖ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП
 ~foo() done! 

рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЕрд╕реНрдерд╛рдпреА рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдХрд┐ рдЗрдирд┐рд╢рд▓рд╛рдЗрдЬрд╝рд░ рд╣реИ, рдФрд░ рдлрд┐рд░, рдЬреИрд╕реЗ рдХрд┐ рд╕рд╛рдорд╛рдиреНрдп рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЕрд╕реНрдерд╛рдпреА рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рдЬреАрд╡рдирдХрд╛рд▓ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рд▓рдВрдмрд╛ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред
рд▓реЗрдХрд┐рди рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ, рдкрд░рд┐рдгрд╛рдо рдереЛрдбрд╝рд╛ рдЕрд▓рдЧ рд╣реИред
рдЖрдЙрдЯрдкреБрдЯ (msvs 2012):
 ~foo() done! ~foo() 
рдФрд░ (g ++ (Ubuntu / Linaro 4.7.3-1ubuntu1) 4.7.3):
 done! ~foo() 


рдЖрдкрдХрд╛ рдзреНрдпрд╛рди рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рдЖрдкрдХрд╛ рджрд┐рди рд╢реБрдн рд╣реЛред

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


All Articles