C ++ рдореВрд▓реНрдп рд╢реНрд░реЗрдгрд┐рдпреЛрдВ рдХрд╛ рддреНрд╡рд░рд┐рдд рд╕рдВрджрд░реНрдн: рднрд╛рдЧ 1

рдЫрд╡рд┐

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


рд╡рд┐рд╖рдп рдХреЗ рдкрд░рд┐рдЪрдп рдХреЗ рд▓рд┐рдП, рдХреГрдкрдпрд╛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд▓рд┐рдВрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ:


рд╕реА ++ rvalue рд╕рдВрджрд░реНрдн рдФрд░ рд╢реБрд░реБрдЖрддреА рдХреЗ рд▓рд┐рдП рд╢рдмреНрджрд╛рд░реНрде рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░реЗрдВ
рдлрд┐рд░ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдП рдЧрдП рдирд┐рдпрдо
C ++ рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЪрд▓рддрд╛ рд╣реИ рдЬреЛ рдирд╣реАрдВ рдЬрд╛рдирддреЗ рдпрд╛ рдкрд░рд╡рд╛рд╣ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдХреМрди-рдХреМрди рд╕реЗ rvalues тАЛтАЛрд╣реИрдВ
рд╕реНрдХреЙрдЯ рдореЗрдпрд░реНрд╕ред рдкреНрд░рднрд╛рд╡реА рдЖрдзреБрдирд┐рдХ рд╕реА ++ред 2015
рдореВрд╡рдореЗрдВрдЯ рдФрд░ рдкрд░рдлреЗрдХреНрдЯ рдлрд╛рд░рд╡рд░реНрдбрд┐рдВрдЧ рдХреЛ рд╕рдордЭрдирд╛: рднрд╛рдЧ 1
рдореВрд╡ рд╕реЗрдордВрдЯрд┐рдХреНрд╕ рдФрд░ рдкрд░рдлреЗрдХреНрдЯ рдлреЙрд░рд╡рд░реНрдбрд┐рдВрдЧ рдХреЛ рд╕рдордЭрдирд╛: рднрд╛рдЧ 2
рдореВрд╡рдореЗрдВрдЯ рд╢рдмреНрджрд╛рд░реНрде рдФрд░ рдкрд░рдлреЗрдХреНрдЯ рдлреЙрд░рд╡рд░реНрдбрд┐рдВрдЧ рдХреЛ рд╕рдордЭрдирд╛: рднрд╛рдЧ 3
рдХреНрдпрд╛ рд╣рдореЗрдВ рдореВрд╡ рдФрд░ рдХреЙрдкреА рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдХреА рдЬрд░реВрд░рдд рд╣реИ


рдореВрд▓реНрдп рд╢реНрд░реЗрдгрд┐рдпреЛрдВ


рдЫрд╡рд┐


C ++ 11 рд╕реЗ рд╢реБрд░реВ рд╣реЛрдХрд░, рдХреЛрдИ рднреА рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗрд╡рд▓ рддреАрди рдорд╛рди рд╢реНрд░реЗрдгрд┐рдпреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реЛ рд╕рдХрддреА рд╣реИ: рд▓реИрд╡рд▓реНрдпреВ, рдЬрд╝рд╡рд▓реНрдпреВ рдпрд╛ рдкреНрд░рд┐рд╡рд▓реНрдпреВ:


  • xvalue (рд╕рдорд╛рдкреНрддрд┐ рдореВрд▓реНрдп) - рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐, рдЬреЛ рдПрдХ рдЧреИрд░-рдЕрд╕реНрдерд╛рдпреА рд╡рд╕реНрддреБ рдХреА рдкрд╣рдЪрд╛рди рдХрд░рддреА рд╣реИ, рдЬрд┐рд╕реЗ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ
  • lvalue (рдмрд╛рдПрдВ рдорд╛рди) - рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐, рдЬреЛ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдПрдХ рдЧреИрд░-рдЕрд╕реНрдерд╛рдпреА рдСрдмреНрдЬреЗрдХреНрдЯ рдХреА рдкрд╣рдЪрд╛рди рдХрд░рддреА рд╣реИ, рдЬрд┐рд╕реЗ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ
  • prvalue (рд╢реБрджреНрдз rvalue) - рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐, рдЬреЛ рдХрд┐рд╕реА рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░рддреА рд╣реИ

рдЫрд╡рд┐


рдЗрди рддреАрди рд╢реНрд░реЗрдгрд┐рдпреЛрдВ рдХреЛ рддреАрди рдЕрддрд┐рд╡реНрдпрд╛рдкреА рд╕рдореВрд╣реЛрдВ рдореЗрдВ рдмрд╛рдВрдЯрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:


  • glvalue (рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рдЕрдВрддрд░рд╛рд▓) рд╕рдореВрд╣ lvalue рдФрд░ xvalueред glvalue рдХрд╛ рдкрддрд╛ рдореЗрдореЛрд░реА рдореЗрдВ рд╣реИ (рдкрд╣рдЪрд╛рди рд╣реИ) рдФрд░ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдЖрдо рддреМрд░ рдкрд░ рдПрдХ рдорд╛рди рдЕрд╕рд╛рдЗрди рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (рдпрджрд┐ рдпрд╣ рд╕реНрдерд┐рд░ рдирд╣реАрдВ рд╣реИ)
  • рдкреНрд░рддрд┐рджреНрд╡рдВрджреНрд╡рд┐рдпреЛрдВ рдХреЗ рд╕рдореВрд╣ рдкреНрд░рдЪрд▓рди рдФрд░ xvalueред rvalue рдХреЛ рдпрд╛ рддреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (xvalue) рдпрд╛ рдХрд┐рд╕реА рдореМрдЬреВрджрд╛ рдСрдмреНрдЬреЗрдХреНрдЯ рд╕реЗ рдмрд┐рд▓рдХреБрд▓ рдирд╣реАрдВ рдорд┐рд▓рддрд╛ рд╣реИ (prvalue)ред рд░рдЪрдирд╛рдХрд╛рд░реЛрдВ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ, рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдпрд╛ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдВрддрд░рд╛рд▓ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ

рддреЛ, рд╕реНрдореГрддрд┐ рдореЗрдВ xvalue рдХрд╛ рдкрддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред


рдЫрд╡рд┐


рдЖрдк рдКрдкрд░ рджреА рдЧрдИ рддрд╛рд▓рд┐рдХрд╛ рд╕реЗ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдирд╛рдо рдХреЗ рдЪрд░, рд▓рд╡рд▓реНрдпреВ рд░реЗрдлрд░реЗрдВрд╕ рдФрд░ рд░реЗрд╡рд▓реНрдпреВ рд░реЗрдлрд░реЗрдВрд╕ рдЗрдВрдЯреЗрдЧреЗрдЯреАрдЬрд╝ рд╕рднреА рдХреА рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреА рдПрдХ рд╣реА рд╢реНрд░реЗрдгреА рд╣реИ: рд▓реИрд╡рд▓реНрдпреВ (рд▓рд╛рд▓ рд░рдВрдЧ рд╕реЗ рд╣рд╛рдЗрд▓рд╛рдЗрдЯреЗрдб)ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ, рдХрд┐ рдЬрдм рдПрдХ рд╕рдВрджрд░реНрдн рдХреЗ рд▓рд┐рдП rvalue рд╕рдВрджрд░реНрдн рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдПрдХ lvalue рд╕рдВрджрд░реНрдн рдЕрдзрд┐рднрд╛рд░ рдЪреБрдирд╛ рдЬрд╛рдПрдЧрд╛: T&& x=T(); f(x); T&& x=T(); f(x);


рд▓рд┐рдВрдХ:
рд╕реА ++ рд▓реИрд╡рд▓реНрдпреВ рд░рд╡рд▓реБ рдЬрд╝рд╡рд▓реНрдпреВ рдЧреНрд▓рд╡реНрдпреВ рдкреНрд░рд╡рд▓реНрдпреВ
C ++ 17 рдореЗрдВ рдореВрд▓реНрдп рд╢реНрд░реЗрдгрд┐рдпрд╛рдВ
рдореВрд▓реНрдп рд╢реНрд░реЗрдгрд┐рдпреЛрдВ


рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рд╕рдВрдХреЗрддрд╛рдХреНрд╖рд░


рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░реЛрдВ, рд╕рдВрдЪрд╛рд▓рдХреЛрдВ рдФрд░ рд╡рд┐рдзреНрд╡рдВрд╕рдХреЛрдВ рдХреА рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпрд╛рдБ:


  • рдбреАрд╕реА - рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░
  • Pc - рдкрд░рд┐рдорд╛рд░реНрдЬрд┐рдд рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░
  • Cc - рдХреЙрдкреА рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░
  • рд╕реАрдП - рдХреЙрдкреА рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ (рдЖрд╡рдВрдЯрд┐рдд рднрдВрдбрд╛рд░рдг рдХрд╛ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП std :: string)
  • Mc - рдореВрд╡ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░
  • рдорд╛ - рдЪрд╛рд▓ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ
  • Va - рд░реВрдкрд╛рдВрддрд░рдг рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдСрдкрд░реЗрдЯрд░
  • рдбреА - рд╡рд┐рдирд╛рд╢рдХрд╛рд░реА

рдореВрд▓реНрдп рд╢реНрд░реЗрдгрд┐рдпреЛрдВ рдХреА рд╕рдВрдХреНрд╖рд┐рдкреНрддрддрд╛:


  • рдПрд▓рд╡реА - рд▓рд╡рд▓реНрдпреВ: T LV;
  • LR - рд▓реИрд╡рд▓реНрдпреВ рд╕рдВрджрд░реНрдн: T& LR = LV;
  • XV - Xvalue: move(LV)
  • рдкреАрдЖрд░рд╡реА - рд╢реБрджреНрдз рдкреНрд░рддрд┐рджреНрд╡рдВрджреНрд╡рд┐рддрд╛ред рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдХрд╛ рд╢рд╛рдмреНрджрд┐рдХ рдпрд╛ рдкрд░рд┐рдгрд╛рдо, рдЬреЛ рд╡рд╛рдкрд╕реА рдкреНрд░рдХрд╛рд░ рдПрдХ рд╕рдВрджрд░реНрдн рдирд╣реАрдВ рд╣реИ: T f() { return T(); } T f() { return T(); }
  • FR - рдЕрдЧреНрд░реЗрд╖рдг рд╕рдВрджрд░реНрдн: auto&& FR = LV;
  • рд╕реАрдПрд▓рд╡реА - рдХрд╛рд╕реНрдЯ рдПрд▓.рд╡реА. рд╕реАрдПрд▓рдЖрд░ - рдХрд╛рд╕реНрдЯ рдПрд▓рдЖрд░ред рд╕реАрдПрдХреНрд╕рд╡реА - рдХрд╛рд╕реНрдЯ рдПрдХреНрд╕рд╡реАред
  • рд╕реАрдкреАрдЖрд░рд╡реА - рдХрд╛рд╕реНрдЯ рдкреАрдЖрд░рд╡реАред CPRV рдХреЗрд╡рд▓ рдХрдХреНрд╖рд╛рдУрдВ рдФрд░ рд╕рд░рдгрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдореМрдЬреВрдж рд╣реИред рдХреЙрдиреНрдЯреЗрд╕реНрдЯ рдЗрдВрдЯ рдХреА рддрд░рд╣ рдиреЙрди-рдХреНрд▓рд╛рд╕ рдиреЙрди-рдЕрд░реЗрдВрдЬ рд╕реАрдкреАрдЖрд░рд╡реА рдХреЛ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рдкреАрдЖрд░рд╡реА рдореЗрдВ рдмрджрд▓ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдЬреИрд╕реЗ рдХрд┐ рдлрдВрдХреНрд╢рди const int f() рд░рд┐рдЯрд░реНрди const int f() ) рдХреЗ рдмрджрд▓реЗ рдореВрд▓реНрдп
  • RV XV рдпрд╛ PRV рд╣реИ
  • CRV CXV рдпрд╛ CPRV рд╣реИ

рдЕрдиреНрдп рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд╡рд┐рд╡рд░рдг:


  • рдкреАрдПрдл - рд╕рд╣реА рдЕрдЧреНрд░реЗрд╖рдг (рдХрд╛рд░реНрдп рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреИрд░рд╛рдореАрдЯрд░ рдкрд╛рд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЯреЗрдореНрдкреНрд▓реЗрдЯреЗрдб рдлрд╝реЙрд░рд╡рд░реНрдбрд┐рдВрдЧ рд╕рдВрджрд░реНрдн рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ)

рдорд╛рди рд╢реНрд░реЗрдгрд┐рдпреЛрдВ рдХреЛ рдЕрд╕рд╛рдЗрди рдХрд░рдирд╛


рд╕рднреА рдирд┐рдореНрди рд╡рд░реНрдЧреЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдореВрд▓реНрдп рд╢реНрд░реЗрдгрд┐рдпреЛрдВ рдХрд╛ рдирд┐рд░реНрдзрд╛рд░рдг рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЬрдм рд╕реНрдкрд╖реНрдЯ рд╢реНрд░реЗрдгреА рд░реВрдкрд╛рдВрддрд░рдг рдХреЗ рдмрд┐рдирд╛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдПрдХ рд╢реНрд░реЗрдгреА рдХреЛ рджреВрд╕рд░реЗ рдХреЛ рдЕрд╕рд╛рдЗрди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдПрдХ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд░реВрдкрд╛рдВрддрд░рдг рд╣реЛрддрд╛ рд╣реИ: FROM_TYPE x; TO_TYPE y; y = x; FROM_TYPE x; TO_TYPE y; y = x; рдиреАрдЪреЗ рджреА рдЧрдИ рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЬрдм рдкреНрд░рдХрд╛рд░ рдХреА рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЛ рдкреНрд░рдХрд╛рд░ рдХреЗ рдПрдХ рдЪрд░ рдХреЛ рд╕реМрдВрдкрд╛ рдЬрд╛рддрд╛ рд╣реИ рддреЛ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ:


  • рдорд╛рдЗрдирд╕ рд╕рд╛рдЗрди рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдРрд╕рд╛ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИ
  • рдПрдХ рдкреНрд▓рд╕ рд╕рд╛рдЗрди рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдРрд╕рд╛ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рд╕рдВрднрд╡ рд╣реИ рдФрд░ рдЗрд╕рдХреЗ рд▓рд┐рдП рдХреЙрдкреА / рдореВрд╡ рдСрдкрд░реЗрдЯрд░реНрд╕ рдпрд╛ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░реНрд╕ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрдЧреАред
  • рдЕрдиреНрдп рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдкрд╛рда рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдРрд╕реЗ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдХреЗ рджреМрд░рд╛рди рдСрдкрд░реЗрдЯрд░реНрд╕ рдФрд░ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░реНрд╕ рдХреЙрдкреА / рдореВрд╡ рдХрд░рддреЗ рд╣реИрдВред

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


рдЫрд╡рд┐


рдлреБрдЯрдиреЛрдЯ:


1 - рдХрд╛рд╕реНрдЯ рдСрдЯреЛ рдФрд░& рд╕рдВрджрд░реНрдн рд╕рдВрджрд░реНрднреЛрдВ рдХреЛ рдЕрдЧреНрд░реЗрд╖рд┐рдд рдирд╣реАрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдХреЙрдиреНрд╕реНрдЯрд▓ рд░реЗрд╡рд▓реНрдпреВ рд░реЗрдлрд░реЗрдВрд╕ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╡реЗ рдХреЙрдиреНрд╕реНрдЯ T && рдХреА рддрд░рд╣ рдХрд╛рд░реНрдп рдХрд░реЗрдВрдЧреЗ
2 - рдПрдХ рд╕рдВрджрд░реНрдн рдЗрдирд┐рд╢рд▓рд╛рдЗрдЬрд╝рд░ рдзрд╛рд░рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдПрдХ рдЕрд╕реНрдерд╛рдпреА рдЕрдкрдиреЗ рд╕рдВрджрд░реНрдн рдХреЗ рджрд╛рдпрд░реЗ рдХреЗ рдЕрдВрдд рддрдХ рдмрдирд╛ рд░рд╣рддрд╛ рд╣реИ (рдЕрдЧрд▓рд╛ рднрд╛рдЧ рджреЗрдЦреЗрдВ)ред рдлрд╝рдВрдХреНрд╢рди рдкреНрд░рдХрд╛рд░ рдореЗрдВ рд╡рд╛рдкрд╕реА рдорд╛рди рдХреЛ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред
3 - рдЬрдм рд╢рд╛рдмреНрджрд┐рдХ рдЧреБрдЬрд░ рд░рд╣рд╛ рд╣реИ, рддреЛ рдСрдЯреЛ рдХреЗ рд▓рд┐рдП рджрд╛рдИрдВ рдУрд░ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдкреНрд░рдХрд╛рд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ: auto&& = T{2};


рдзреНрдпрд╛рди рджреЗрдВ:


  • рдЧреИрд░-рдХреЙрдиреНрд╕реНрдЯреЗрдмрд▓ рд▓реИрд╡рд▓реНрдпреВ рдФрд░ рд░реЗрд╡рд▓реНрдпреВ рд╕рдВрджрд░реНрдн рдХрд┐рд╕реА рднреА рдХреЙрд╕реНрдЯ рдкреНрд░рдХрд╛рд░ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдиреЙрди-рдХрд╛рд╕реНрдЯ рдиреЙрди-рд░реЗрдлрд░реЗрдВрд╕ рдЯрд╛рдЗрдк рдХреЙрдиреНрд╕реНрдЯ рдЯрд╛рдЗрдк рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░ рд╕рдХрддрд╛ рд╣реИред
  • рд░реВрд╡реЗрд▓реНрдпреВ рд╕рдВрджрд░реНрдн (T &&) xvalue рдпрд╛ рдкреНрд░рд╡рд▓реНрдпреВ (XV рдпрд╛ PRV) рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░ рд╕рдХрддрд╛ рд╣реИред
  • Lvalue рд╕рдВрджрд░реНрдн (T &) рд▓реИрд╡рд▓реНрдпреВ рдпрд╛ рд▓реИрд╡рд▓реНрдпреВ рд╕рдВрджрд░реНрдн (LV рдпрд╛ LR) рд╕реНрд╡реАрдХрд╛рд░ рдХрд░ рд╕рдХрддрд╛ рд╣реИ
  • рдЧреИрд░-рд╕рдВрджрд░реНрдн рдкреНрд░рдХрд╛рд░ рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХреЛ рдкрд░рд┐рд╡рд░реНрддрд┐рдд, рдХреЙрдкреА, рдореВрд╡рд┐рдВрдЧ рдпрд╛ рдЖрд░рд╡реАрдУ рджреНрд╡рд╛рд░рд╛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ
  • рдХреЙрдиреНрд╕реНрдЯрд▓ рд▓реИрд╡рд▓реНрдпреВ рд░реЗрдлрд░реЗрдВрд╕ (рдХреЙрдиреНрд╕реНрдЯ рдЯреА рдПрдВрдб, рдХрд╛рд╕реНрдЯ рдСрдЯреЛ рдПрдВрдб) рдФрд░ рдСрдЯреЛ рдлреЙрд░рд╡рд░реНрдбрд┐рдВрдЧ рд░реЗрдлрд░реЗрдВрд╕ (рдСрдЯреЛ &&) рдмрд┐рдирд╛ рдХреЙрдкреА рдпрд╛ рдореВрд╡ рдХреЗ рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддреЗ рд╣реИрдВред
  • рдХреЙрдиреНрд╕реНрдЯ рдФрд░ рдиреЙрди-рдХреЙрдиреНрд╕реНрдЯрд▓ рд░реИрд╡рд▓реНрдпреВ рд░реЗрдлрд░реЗрдВрд╕ (T &&, const T &&) рдХреЙрдиреНрд╕реНрдЯреЗрдВрдЯ рдпрд╛ рдиреЙрди-рдХреЙрдиреНрд╕реНрдЯрд▓ рд▓реЗрд╡реЗрд▓реНрд╕ (LV рдпрд╛ CLV) рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
  • LR, рдХреЙрдиреНрд╕реНрдЯреЗрдВрдЯ рдпрд╛ рдиреЙрди-рдХреЙрдиреНрд╕реНрдЯрд▓ рд░реЗрд╡рд▓реНрдпреВ рд░реЗрдлрд░реЗрдВрд╕ (XV рдпрд╛ PRV рдпрд╛ CXV рдпрд╛ CPRV) рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ред рд╕реАрдПрд▓рдЖрд░ рдЙрдиреНрд╣реЗрдВ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
  • рдХреЙрдиреНрд╕реНрдЯ рдореЙрдбрд┐рдлрд╝рд╛рдпрд░ рдХреЗ рд╕рд╛рде рдЯрд╛рдЗрдкреНрд╕ рдХреЛ рдХреЙрдиреНрд╕реНрдЯрд┐рдлрд╝рд╛рдЗрдЬрд╝рд░ рдХреЗ рдмрд┐рдирд╛ рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХреЛ рдирд╣реАрдВ рд╕реМрдВрдкрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (рдСрдЯреЛ рдХреЛ рдЫреЛрдбрд╝рдХрд░, рдЬреЛ рдХрд┐ рдХрд╛рдБрд╕реНрдЯ рдмрди рд╕рдХрддрд╛ рд╣реИ рдЕрдЧрд░ рджрд╛рдИрдВ рдУрд░ рдХреЙрд╕реНрдЯ рд╕реНрдкрд╖реНрдЯ рд╣реИ)ред
  • рдкрд╛рд╕рд┐рдВрдЧ рдкреНрд░рд┐рд╡рд▓реНрдпреВ (рдкрд╛рд╕рд┐рдВрдЧ рд╡реИрд▓реНрдпреВ, рд╢рд╛рдмреНрджрд┐рдХ рдпрд╛ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рд░рд┐рдЬрд▓реНрдЯ рдкрд╛рд╕ рдХрд░рдирд╛) рдЙрддреНрддреАрд░реНрдг xvalue рдХреЗ рд╕рдорд╛рди рд╣реИ, рд▓реЗрдХрд┐рди рдЧреИрд░-рд╕рдВрджрд░реНрдн рдкреНрд░рдХрд╛рд░ рдХреЛ рдЕрд╕рд╛рдЗрди рдХрд░рддреЗ рд╕рдордп рдХреЙрд▓ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рд╕реЗ рдмрдЪрд╛ рдЬрд╛рддрд╛ рд╣реИ
  • рдкрд╛рд╕рд┐рдВрдЧ рдХреЙрдиреНрд╕реНрдЯрд▓ рдкреНрд░рд┐рд╡реНрдпреВ (рдХреЙрдиреНрд╕реНрдЯреЗрдВрдЯ рдкреНрд░рдХрд╛рд░ рдХреЗ рдлрдВрдХреНрд╢рди рдХрд╛ рдкрд╛рд╕рд┐рдВрдЧ рд╡реИрд▓реНрдпреВ) рдкрд╛рд╕рд┐рдВрдЧ рдЬрд╝реИрд╡рд▓реНрдпреВ рдХреЗ рд╕рдорд╛рди рд╣реИ, рд▓реЗрдХрд┐рди рдиреЙрди-рд░реЗрдлрд░реЗрдВрд╕ рдЯрд╛рдЗрдк рдХреЛ рдЕрд╕рд╛рдЗрди рдХрд░рдиреЗ рдкрд░ рдХреЙрдкреА рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рд╕реЗ рдмрдЪрд╛ рдЬрд╛рддрд╛ рд╣реИ
  • рдСрдЯреЛ рд╕рдВрджрд░реНрдн рдХреЙрдиреНрд╕реНрдЯреЗрдВрдЯ рдмрди рд╕рдХрддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╡реЗ рдХреЙрдиреНрд╕реНрдЯ рдФрд░ рдиреЙрди-рдХреЙрд╕реНрдЯ рджреЛрдиреЛрдВ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╡реЗ рд╕рдВрджрд░реНрдн рдХреЗ рджрд╛рдпрд░реЗ рдХреЗ рдЕрдВрдд рддрдХ рдЕрд╕реНрдерд╛рдпреА рд░реВрдк рд╕реЗ рдмрдиреЗ рд░рд╣рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЙрдиреНрд╕реНрдЯ рд░реЗрдлрд░реЗрдВрд╕ рдмрди рд╕рдХрддреЗ рд╣реИрдВред рдпрджрд┐ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рджрд╛рдИрдВ рдУрд░ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдСрдЯреЛ * рд╕рдВрджрд░реНрднреЛрдВ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рдирд╣реАрдВ рдмрди рд╕рдХрддрд╛ рд╣реИред рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдЖрдк рдСрдЯреЛ рдФрд░ рдСрдЯреЛ рдХреЛ рдкреНрд░рддрд┐рджреНрд╡рдВрджреНрд╡рд┐рддрд╛ рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ
  • рдХреЙрдиреНрд╕реНрдЯ рд░реЗрдлрд░реЗрдВрд╕ рдПрдХ рдЕрд╕реНрдерд╛рдпреА рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рддрдм рддрдХ рдЬрд╛рд░реА рд░рдЦ рд╕рдХрддрд╛ рд╣реИ рдЬрдм рддрдХ рдХрд┐ рд░реЗрдлрд░реЗрдВрд╕ рд╕реНрдХреЛрдк (рдиреЙрди-рдХреЙрд╕реНрдЯ рд░реЗрдлрд░реЗрдВрд╕ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛)ред рдпрд╣ рдХреЗрд╡рд▓ рд╡рд░реНрддрдорд╛рди рджрд╛рдпрд░реЗ (рд╕реНрдерд╛рдиреАрдп рдлрд╝рдВрдХреНрд╢рди рд╕рдВрджрд░реНрдн рдФрд░ рдлрд╝рдВрдХреНрд╢рди рддрд░реНрдХ) рдХреЗ рдЕрдВрджрд░ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ рд╕рдВрджрд░реНрдн рдПрдХ рд╡рд░реНрдЧ рдХрд╛ рд╕рджрд╕реНрдп рд╣реИ, рддреЛ рдЕрд╕реНрдерд╛рдпреА рд╡рд╕реНрддреБ рдХреЛ рдирд┐рд░реНрдорд╛рддрд╛ рдпрд╛ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЕрдВрдд рдореЗрдВ рдирд╖реНрдЯ рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдФрд░ рд╕рдВрджрд░реНрдн рдПрдХ рд╡рд┐рдирд╛рд╢рдХрд╛рд░реА рд╡рд╕реНрддреБ рдХреА рдУрд░ рдЗрд╢рд╛рд░рд╛ рдХрд░рддрд╛ рд░рд╣реЗрдЧрд╛, рдЬреЛ рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рд╣реИред
  • Auto x = CLV; рдСрдЯреЛ рдХреЛ рдиреЙрди-рдХрд╛рд╕реНрдЯ рдкреНрд░рдХрд╛рд░ рдореЗрдВ рдХрдЯреМрддреА рдХрд░реЗрдЧрд╛ред

рдкреНрд░рддреНрдпреЗрдХ рдирд┐рд░реНрдорд╛рддрд╛ рдФрд░ рдСрдкрд░реЗрдЯрд░ рдХреЗ рдореБрджреНрд░рдг рдХреЗ рд╕рд╛рде рдЙрджрд╛рд╣рд░рдг рдФрд░ рдкрд░реАрдХреНрд╖рдг
 #include <iostream> #include <iomanip> #include <map> #include <vector> #include <string> using namespace std; template<class C, class T> auto contains(const C& v, const T& x) -> decltype(end(v), true) { return end(v) != std::find(begin(v), end(v), x); } template <class... Types> constexpr inline __attribute__((__always_inline__)) int UNUSED(Types&&...) { return 0; }; map<string, map<string, string>> res; vector<string> froms; vector<string> tos; string from; string to; void report(string st) { if (!from.empty() && !to.empty()) { res[from][to] += st; } cout << st << " "; } struct T { T() { report("Dc"); } T(int va) : a(va) { report("Pc"); } T(const T& other) : a(other.a) { report("Cc"); } T(T&& other) : a(std::exchange(other.a, 0)) { report("Mc"); } T& operator=(int va) { report("Va"); a = va; return *this; } T& operator=(const T& rhs) { report("Ca"); // check for self-assignment if(&rhs == this) return *this; a = rhs.a; return *this; } T& operator=(T&& rhs) { report("Ma"); // check for self-assignment if(&rhs == this) return *this; a = std::exchange(rhs.a, 0); return *this; } ~T() { report("D"); } int a = 1; }; T Fprv() { return T(); } const T Fcprv() { return T(); } void print_col(const string &st, int width) { cout << endl << left << setw(width) << st; } void test_assign(string lto, string lfrom) { from = lfrom; to = lto; res[from][to] = ""; if (!from.empty() && !to.empty()) { if (!contains(froms, from)) froms.push_back(from); if (!contains(tos, to)) tos.push_back(to); } print_col(lto + " = " + lfrom + ": ", 20); } #define TEST_ASSIGN(t, v) { \ test_assign(#t, #v); \ ts = v; \ cout << sa; \ UNUSED(s); \ cout << "-"; \ } void test_conversion() { T l; const T cl; T& lr = l; const T& clr = l; T&& rr = T(); const T&& crr = T(); auto &&fr = T(); TEST_ASSIGN(T, 8); TEST_ASSIGN(T, T()); TEST_ASSIGN(T, l); TEST_ASSIGN(T, move(l)); TEST_ASSIGN(T, cl); TEST_ASSIGN(T, move(cl)); TEST_ASSIGN(T, lr); TEST_ASSIGN(T, move(lr)); TEST_ASSIGN(T, clr); TEST_ASSIGN(T, move(clr)); TEST_ASSIGN(T, rr); TEST_ASSIGN(T, move(rr)); TEST_ASSIGN(T, crr); TEST_ASSIGN(T, move(crr)); TEST_ASSIGN(T, Fcprv()); TEST_ASSIGN(T, Fprv()); TEST_ASSIGN(T, fr); TEST_ASSIGN(T, move(fr)); TEST_ASSIGN(const T, 8); TEST_ASSIGN(const T, T()); TEST_ASSIGN(const T, l); TEST_ASSIGN(const T, move(l)); TEST_ASSIGN(const T, cl); TEST_ASSIGN(const T, move(cl)); TEST_ASSIGN(const T, lr); TEST_ASSIGN(const T, move(lr)); TEST_ASSIGN(const T, clr); TEST_ASSIGN(const T, move(clr)); TEST_ASSIGN(const T, rr); TEST_ASSIGN(const T, move(rr)); TEST_ASSIGN(const T, crr); TEST_ASSIGN(const T, move(crr)); TEST_ASSIGN(const T, Fcprv()); TEST_ASSIGN(const T, Fprv()); TEST_ASSIGN(const T, fr); TEST_ASSIGN(const T, move(fr)); //TEST_ASSIGN(T&, 8); //TEST_ASSIGN(T&, T()); TEST_ASSIGN(T&, l); //TEST_ASSIGN(T&, move(l)); //TEST_ASSIGN(T&, cl); //TEST_ASSIGN(T&, move(cl)); TEST_ASSIGN(T&, lr); //TEST_ASSIGN(T&, move(lr)); //TEST_ASSIGN(T&, clr); //TEST_ASSIGN(T&, move(clr)); //TEST_ASSIGN(T&, rr); //TEST_ASSIGN(T&, move(rr)); //TEST_ASSIGN(T&, crr); //TEST_ASSIGN(T&, move(crr)); //TEST_ASSIGN(T&, Fcprv()); //TEST_ASSIGN(T&, Fprv()); TEST_ASSIGN(T&, fr); //TEST_ASSIGN(T&, move(fr)); TEST_ASSIGN(const T&, 8); TEST_ASSIGN(const T&, T()); TEST_ASSIGN(const T&, l); TEST_ASSIGN(const T&, move(l)); TEST_ASSIGN(const T&, cl); TEST_ASSIGN(const T&, move(cl)); TEST_ASSIGN(const T&, lr); TEST_ASSIGN(const T&, move(lr)); TEST_ASSIGN(const T&, clr); TEST_ASSIGN(const T&, move(clr)); TEST_ASSIGN(const T&, rr); TEST_ASSIGN(const T&, move(rr)); TEST_ASSIGN(const T&, crr); TEST_ASSIGN(const T&, move(crr)); TEST_ASSIGN(const T&, Fcprv()); TEST_ASSIGN(const T&, Fprv()); TEST_ASSIGN(const T&, fr); TEST_ASSIGN(const T&, move(fr)); TEST_ASSIGN(T&&, 8); TEST_ASSIGN(T&&, T()); //TEST_ASSIGN(T&&, l); TEST_ASSIGN(T&&, move(l)); //TEST_ASSIGN(T&&, cl); //TEST_ASSIGN(T&&, move(cl)); //TEST_ASSIGN(T&&, lr); TEST_ASSIGN(T&&, move(lr)); //TEST_ASSIGN(T&&, clr); //TEST_ASSIGN(T&&, move(clr)); //TEST_ASSIGN(T&&, rr); TEST_ASSIGN(T&&, move(rr)); //TEST_ASSIGN(T&&, crr); //TEST_ASSIGN(T&&, move(crr)); //TEST_ASSIGN(T&&, Fcprv()); TEST_ASSIGN(T&&, Fprv()); //TEST_ASSIGN(T&&, fr); TEST_ASSIGN(T&&, move(fr)); TEST_ASSIGN(const T&&, 8); TEST_ASSIGN(const T&&, T()); //TEST_ASSIGN(const T&&, l); TEST_ASSIGN(const T&&, move(l)); //TEST_ASSIGN(const T&&, cl); TEST_ASSIGN(const T&&, move(cl)); //TEST_ASSIGN(const T&&, lr); TEST_ASSIGN(const T&&, move(lr)); //TEST_ASSIGN(const T&&, clr); TEST_ASSIGN(const T&&, move(clr)); //TEST_ASSIGN(const T&&, rr); TEST_ASSIGN(const T&&, move(rr)); //TEST_ASSIGN(const T&&, crr); TEST_ASSIGN(const T&&, move(crr)); TEST_ASSIGN(const T&&, Fcprv()); TEST_ASSIGN(const T&&, Fprv()); //TEST_ASSIGN(const T&&, fr); TEST_ASSIGN(const T&&, move(fr)); //TEST_ASSIGN(auto&, T{8}); //TEST_ASSIGN(auto&, T()); TEST_ASSIGN(auto&, l); //TEST_ASSIGN(auto&, move(l)); TEST_ASSIGN(auto&, cl); TEST_ASSIGN(auto&, move(cl)); TEST_ASSIGN(auto&, lr); //TEST_ASSIGN(auto&, move(lr)); TEST_ASSIGN(auto&, clr); TEST_ASSIGN(auto&, move(clr)); TEST_ASSIGN(auto&, rr); //TEST_ASSIGN(auto&, move(rr)); TEST_ASSIGN(auto&, crr); TEST_ASSIGN(auto&, move(crr)); TEST_ASSIGN(auto&, Fcprv()); //TEST_ASSIGN(auto&, Fprv()); TEST_ASSIGN(auto&, fr); //TEST_ASSIGN(auto&, move(fr)); TEST_ASSIGN(const auto&, T{8}); TEST_ASSIGN(const auto&, T()); TEST_ASSIGN(const auto&, l); TEST_ASSIGN(const auto&, move(l)); TEST_ASSIGN(const auto&, cl); TEST_ASSIGN(const auto&, move(cl)); TEST_ASSIGN(const auto&, lr); TEST_ASSIGN(const auto&, move(lr)); TEST_ASSIGN(const auto&, clr); TEST_ASSIGN(const auto&, move(clr)); TEST_ASSIGN(const auto&, rr); TEST_ASSIGN(const auto&, move(rr)); TEST_ASSIGN(const auto&, crr); TEST_ASSIGN(const auto&, move(crr)); TEST_ASSIGN(const auto&, Fcprv()); TEST_ASSIGN(const auto&, Fprv()); TEST_ASSIGN(const auto&, fr); TEST_ASSIGN(const auto&, move(fr)); TEST_ASSIGN(auto&&, T{8}); TEST_ASSIGN(auto&&, T()); TEST_ASSIGN(auto&&, l); TEST_ASSIGN(auto&&, move(l)); TEST_ASSIGN(auto&&, cl); TEST_ASSIGN(auto&&, move(cl)); TEST_ASSIGN(auto&&, lr); TEST_ASSIGN(auto&&, move(lr)); TEST_ASSIGN(auto&&, clr); TEST_ASSIGN(auto&&, move(clr)); TEST_ASSIGN(auto&&, rr); TEST_ASSIGN(auto&&, move(rr)); TEST_ASSIGN(auto&&, crr); TEST_ASSIGN(auto&&, move(crr)); TEST_ASSIGN(auto&&, Fcprv()); TEST_ASSIGN(auto&&, Fprv()); TEST_ASSIGN(auto&&, fr); TEST_ASSIGN(auto&&, move(fr)); TEST_ASSIGN(const auto&&, T{8}); TEST_ASSIGN(const auto&&, T()); //TEST_ASSIGN(const auto&&, l); TEST_ASSIGN(const auto&&, move(l)); //TEST_ASSIGN(const auto&&, cl); TEST_ASSIGN(const auto&&, move(cl)); //TEST_ASSIGN(const auto&&, lr); TEST_ASSIGN(const auto&&, move(lr)); //TEST_ASSIGN(const auto&&, clr); TEST_ASSIGN(const auto&&, move(clr)); //TEST_ASSIGN(const auto&&, rr); TEST_ASSIGN(const auto&&, move(rr)); //TEST_ASSIGN(const auto&&, crr); TEST_ASSIGN(const auto&&, move(crr)); TEST_ASSIGN(const auto&&, Fcprv()); TEST_ASSIGN(const auto&&, Fprv()); //TEST_ASSIGN(const auto&&, fr); TEST_ASSIGN(const auto&&, move(fr)); cout << endl; const int twidth = 9; cout << left << setw(twidth) << "From:"; for (const auto& lto : tos) { cout << left << setw(twidth) << lto; } cout << endl; for (const auto& lfrom : froms) { cout << left << setw(twidth) << lfrom; for (const auto& lto : tos) { if (!res.count(lfrom) || !res[lfrom].count(lto)) { cout << left << setw(twidth) << "-"; } else if (res[lfrom][lto].empty()) { cout << left << setw(twidth) << "+"; } else { cout << left << setw(twidth) << res[lfrom][lto]; } } cout << endl; } cout << endl; } int main() { test_conversion(); cout << endl; return 0; } /* Output: Dc Dc Dc Dc Dc T = 8: Pc 8-D T = T(): Dc 1-D T = l: Cc 1-D T = move(l): Mc 1-D T = cl: Cc 1-D T = move(cl): Cc 1-D T = lr: Cc 0-D T = move(lr): Mc 0-D T = clr: Cc 0-D T = move(clr): Cc 0-D T = rr: Cc 1-D T = move(rr): Mc 1-D T = crr: Cc 1-D T = move(crr): Cc 1-D T = Fcprv(): Dc 1-D T = Fprv(): Dc 1-D T = fr: Cc 1-D T = move(fr): Mc 1-D const T = 8: Pc 8-D const T = T(): Dc 1-D const T = l: Cc 0-D const T = move(l): Mc 0-D const T = cl: Cc 1-D const T = move(cl): Cc 1-D const T = lr: Cc 0-D const T = move(lr): Mc 0-D const T = clr: Cc 0-D const T = move(clr): Cc 0-D const T = rr: Cc 0-D const T = move(rr): Mc 0-D const T = crr: Cc 1-D const T = move(crr): Cc 1-D const T = Fcprv(): Dc 1-D const T = Fprv(): Dc 1-D const T = fr: Cc 0-D const T = move(fr): Mc 0-D T& = l: 0- T& = lr: 0- T& = fr: 0- const T& = 8: Pc 8-D const T& = T(): Dc 1-D const T& = l: 0- const T& = move(l): 0- const T& = cl: 1- const T& = move(cl): 1- const T& = lr: 0- const T& = move(lr): 0- const T& = clr: 0- const T& = move(clr): 0- const T& = rr: 0- const T& = move(rr): 0- const T& = crr: 1- const T& = move(crr): 1- const T& = Fcprv(): Dc 1-D const T& = Fprv(): Dc 1-D const T& = fr: 0- const T& = move(fr): 0- T&& = 8: Pc 8-D T&& = T(): Dc 1-D T&& = move(l): 0- T&& = move(lr): 0- T&& = move(rr): 0- T&& = Fprv(): Dc 1-D T&& = move(fr): 0- const T&& = 8: Pc 8-D const T&& = T(): Dc 1-D const T&& = move(l): 0- const T&& = move(cl): 1- const T&& = move(lr): 0- const T&& = move(clr): 0- const T&& = move(rr): 0- const T&& = move(crr): 1- const T&& = Fcprv(): Dc 1-D const T&& = Fprv(): Dc 1-D const T&& = move(fr): 0- auto& = l: 0- auto& = cl: 1- auto& = move(cl): 1- auto& = lr: 0- auto& = clr: 0- auto& = move(clr): 0- auto& = rr: 0- auto& = crr: 1- auto& = move(crr): 1- auto& = Fcprv(): Dc 1-D auto& = fr: 0- const auto& = T{8}: Pc 8-D const auto& = T(): Dc 1-D const auto& = l: 0- const auto& = move(l): 0- const auto& = cl: 1- const auto& = move(cl): 1- const auto& = lr: 0- const auto& = move(lr): 0- const auto& = clr: 0- const auto& = move(clr): 0- const auto& = rr: 0- const auto& = move(rr): 0- const auto& = crr: 1- const auto& = move(crr): 1- const auto& = Fcprv(): Dc 1-D const auto& = Fprv(): Dc 1-D const auto& = fr: 0- const auto& = move(fr): 0- auto&& = T{8}: Pc 8-D auto&& = T(): Dc 1-D auto&& = l: 0- auto&& = move(l): 0- auto&& = cl: 1- auto&& = move(cl): 1- auto&& = lr: 0- auto&& = move(lr): 0- auto&& = clr: 0- auto&& = move(clr): 0- auto&& = rr: 0- auto&& = move(rr): 0- auto&& = crr: 1- auto&& = move(crr): 1- auto&& = Fcprv(): Dc 1-D auto&& = Fprv(): Dc 1-D auto&& = fr: 0- auto&& = move(fr): 0- const auto&& = T{8}: Pc 8-D const auto&& = T(): Dc 1-D const auto&& = move(l): 0- const auto&& = move(cl): 1- const auto&& = move(lr): 0- const auto&& = move(clr): 0- const auto&& = move(rr): 0- const auto&& = move(crr): 1- const auto&& = Fcprv(): Dc 1-D const auto&& = Fprv(): Dc 1-D const auto&& = move(fr): 0- From: T const T T& const T& T&& const T&&auto& const auto&auto&& const auto&& 8 PcD PcD - PcD PcD PcD - - - - T() DcD DcD - DcD DcD DcD - DcD DcD DcD l CcD CcD + + - - + + + - move(l) McD McD - + + + - + + + cl CcD CcD - + - - + + + - move(cl) CcD CcD - + - + + + + + lr CcD CcD + + - - + + + - move(lr) McD McD - + + + - + + + clr CcD CcD - + - - + + + - move(clr)CcD CcD - + - + + + + + rr CcD CcD - + - - + + + - move(rr) McD McD - + + + - + + + crr CcD CcD - + - - + + + - move(crr)CcD CcD - + - + + + + + Fcprv() DcD DcD - DcD - DcD DcD DcD DcD DcD Fprv() DcD DcD - DcD DcD DcD - DcD DcD DcD fr CcD CcD + + - - + + + - move(fr) McD McD - + + + - + + + T{8} - - - - - - - PcD PcD PcD DDDDD */ 

рдЕрд╕реНрдерд╛рдпреА рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд╕рд╛рде рдирд┐рд░рдВрддрд░ рд╕рдВрджрд░реНрдн рд╢реБрд░реВ рдХрд░рдирд╛


C ++ рдЕрд╕реНрдерд╛рдпреА рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд╕рд╛рде рдПрдХ рдирд┐рд░рдВрддрд░ рд╕рдВрджрд░реНрдн рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдПрдХ рдЕрд╕реНрдерд╛рдпреА рд╡рд╕реНрддреБ рдХрд╛ рдЬреАрд╡рдирдХрд╛рд▓ рдмрдврд╝рд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЙрджрд╛рд╣рд░рдг:


 struct T { int i = 1; }; const T& t = T(); cout << ti; 

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


 class A { public: // Will not compile: value-initialization of reference type //A() : t() {} const T& t; }; class B { public: // Will compile in some compilers, but temporary object will be destructed at the end of constructor B() : t(T()) { cout << "In constructor: " << ti << endl; } const T& t; }; class C { public: // Will compile, but temporary object will be destructed at the end of constructor // Address sanitizer will show the problem C() : t(std::move(T())) { cout << "In constructor: " << ti << endl; } const T& t; }; C c; cout << "C: " << cti << endl; 

рдПрдбреНрд░реЗрд╕ рд╕реИрдирд┐рдЯрд╛рдЗрдЬрд░ рдХреЗ рдмрд┐рдирд╛ рдпрд╣ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреБрдЫ рдХрдЪрд░рд╛ рдЙрддреНрдкрд╛рджрди рдХрд░реЗрдЧрд╛, рдФрд░ рдПрдбреНрд░реЗрд╕ рд╕реИрдирд┐рдЯрд╛рдЗрдЬрд░ рдХреЗ рд╕рд╛рде рдПрдХ рддреНрд░реБрдЯрд┐ рджрд┐рдЦрд╛рдИ рдЬрд╛рдПрдЧреАред рдЗрд╕ рдХрд╛рд░рдг рд╕реЗ thi C ++ рдлреАрдЪрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдпрд╛ рд╕рд╛рд╡рдзрд╛рдиреА рдХреЗ рд╕рд╛рде рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред


рд▓рд┐рдВрдХ:
рд╕рдВрджрд░реНрдн рдЖрд░рдВрднреАрдХрд░рдг
рдЕрд╕реНрдерд╛рдИ рд╡рд╕реНрддреБрдУрдВ рдХрд╛ рд╕рдВрджрд░реНрдн рджреЗрдВ
рдПрдХ рдЕрд╕реНрдерд╛рдпреА рдХреЗ рдЙрдк-рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП рдПрдХ рдХрд╛рд╕реНрдЯ рд╕рдВрджрд░реНрдн рдХреЛ рдмрд╛рдВрдзрдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ




рднрд╛рдЧ реи рдкрд░ рдЬрд╛рдПрдБ

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


All Articles