рдХреНрдпрд╛ рдЖрдк рдЪрд╛рд▓ рд╢рдмреНрджрд╛рд░реНрде рдХреЛ рд╕рдордЭрддреЗ рд╣реИрдВ?

рд╢реБрдн рджреЛрдкрд╣рд░

рдХрд▓ рдореИрдВрдиреЗ рдИрдорд╛рдирджрд╛рд░реА рд╕реЗ рд╕реЛрдЪрд╛ рдерд╛ рдХрд┐ рдореБрдЭреЗ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ рд╕реА ++ 11 рдореЗрдВ рдХреИрд╕реЗ рд╕рдВрджрд░реНрдн рдХрд╛рд░реНрдп рд╣реЛрддрд╛ рд╣реИред рдореИрдВрдиреЗ рд╕реЛрдЪрд╛ рдХрд┐ рдЬрдм рддрдХ рдореИрдВ рдПрдХ рд░реЗрдХ рдореЗрдВ рдирд╣реАрдВ рдЖрдпрд╛ред

рдЗрд╕рд▓рд┐рдП, рдореИрдВ рдЖрдкрдХреЗ рджрд┐рдорд╛рдЧ рдХреЛ рд▓рдВрдмрд╛ рдХрд░рдиреЗ рдХрд╛ рд╕реБрдЭрд╛рд╡ рджреЗрддрд╛ рд╣реВрдВ рдФрд░ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддрд╛ рд╣реВрдВ___rrред рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рд╕рдордЭ рдкрд░реАрдХреНрд╖рдг: рд╕рдлрд▓рддрд╛ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд░реВрдк рдореЗрдВ рдЧрд┐рдирд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдмрд╢рд░реНрддреЗ рдХрд┐ рдЖрдкрдиреЗ рдЗрд╕реЗ рдХрднреА рднреА рдбрд┐рдмрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИред рдХрдЯ рдХреЗ рддрд╣рдд рдиреМрдХрд░реА рдХрд╛ рд╡рд┐рд╡рд░рдгред

рддреЛ, рд╣рд╛рд▓рддред
рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рд╣реИ:
рдЯреЗрдореНрдкрд▓реЗрдЯ < рд╡рд░реНрдЧ U >
рдХреНрд▓рд╛рд╕ рдХрдВрдЯреЗрдирд░
{
рдпреВ рд╕рджрд╕реНрдп ;

рдЬрдирддрд╛ :

U & Get ( ) { рд░рд┐рдЯрд░реНрди рд╕рджрд╕реНрдп ; }
const U & Get ( ) const { рд░рд┐рдЯрд░реНрди рд╕рджрд╕реНрдп ; }

рдЬрдирддрд╛ :

рдЯреЗрдореНрдкрд▓реЗрдЯ < рд╡рд░реНрдЧ рдЯреА > рд╢реВрдиреНрдп рдбрдореА ( рдХрд╛рд╕реНрдЯ рдХрдВрдЯреЗрдирд░ < рдЯреА > & ) ; // рдХреЙрдкреА
рдЯреЗрдореНрдкрд▓реЗрдЯ < рд╡рд░реНрдЧ T > рд╢реВрдиреНрдп рдбрдореА ( рдХрдВрдЯреЗрдирд░ < T > && ) ; // рдЪрд▓рддреЗ рд╣реИрдВ

рдЬрдирддрд╛ :

// рдЯреА рдХрдВрдЯреЗрдирд░ рдХреЗ рд╕рд╛рде рд╕рдВрдЧрдд рд╣реЛрдиреЗ рдХреА рдЙрдореНрдореАрдж рд╣реИ
рдЯреЗрдореНрдкрд▓реЗрдЯ < рд╡рд░реНрдЧ рдЯреА >
рд╢реВрдиреНрдп Fwd ( T && rr )
{
рд╕рджрд╕реНрдп = Move_if_rr < T > ( rrред Get ( ) ) ;
// рдбрдореА (std :: рдЖрдЧреЗ <T> (rr))
}
} ;
рдХрдВрдЯреЗрдирд░ рдЬрд╛рдирдмреВрдЭрдХрд░ рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рддрд╛рдХрд┐ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рджрд╕реНрдп рдкреНрд░рдХрд╛рд░ рдЕрдЬреНрдЮрд╛рдд рд╣реЛред
рдбрдореА рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗрд╡рд▓ рдореВрд╡_рдлреНрд░реА_рд░реНрд░ (рдиреАрдЪреЗ) рдХреЗ рд╢рдмреНрджрд╛рд░реНрде рдХреЛ рд╕реНрдкрд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реЛрддреА рд╣реИред
рдКрдкрд░ рджрд┐рдП рдЧрдП рдХреЛрдб рдореЗрдВ рдХреЛрдИ рднреА рд╢рдмреНрджрд╛рд░реНрде рднрд╛рд░ рдирд╣реАрдВ рд╣реИ, рд╕рднреА рдореИрдЪреЛрдВ рдХреЛ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдорд╛рдиреЗрдВред

рдПрдХ рдлрд╝рдВрдХреНрд╢рди Move_if_rr рд▓рд┐рдЦрдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдЬреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдирд┐рдпрдореЛрдВ рдХреЛ рдкреВрд░рд╛ рдХрд░рддрд╛ рд╣реИ:
рдпрджрд┐ рдХрдВрдЯреЗрдирд░ рдореЗрдВ рдЖрдЧреЗ рдЯрд┐рдкреНрдкрдгреА рдХреА рдЧрдИ рд╣реИред
* Move_if_rr рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рд╕рджрд╕реНрдп рдлрд╝реАрд▓реНрдб рдХреЗ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд-рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдХреЗ рд▓рд┐рдП рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
рдпрджрд┐ рдХрдВрдЯреЗрдирд░ рдореЗрдВ рдЖрдЧреЗ рдЯрд┐рдкреНрдкрдгреА рдХреА рдЧрдИ рд╣реИред рдбреАрдбреА рдХреЙрд▓ рдбрдореА , рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рд╣реИрдВ:
* Move_if_rr рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рд╕рджрд╕реНрдп рдлрд╝реАрд▓реНрдб рдХреЗ рдХреЙрдкреА-рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдХреЗ рд▓рд┐рдП рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
рджреЛрдиреЛрдВ рдирд┐рдпрдо рдорд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдХрдВрдЯреЗрдирд░ рдкреНрд░рдХрд╛рд░ рдХреЛ рдХрдВрдЯреЗрдирд░ рдХреЗ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред

рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рдирд┐рд░реНрдгрдп рдЕрдкреЗрдХреНрд╖рд┐рдд рд╣реИрдВред

UPD1ред рдХреЛрдб рдХреЛ рдмрд╛рд╣рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк highlight.hohli.com рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рдЖрдкрдХреЛ "рдлрд╝реЙрдиреНрдЯ рдЯреИрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ (рд╣рд╛рдмрд░рд╛рд╣рд╛ рдХреЗ рд▓рд┐рдП))"

UPD2ред рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЬреЛ рдпрд╣ рдирд╣реАрдВ рд╕рдордЭрддреЗ рд╣реИрдВ рдХрд┐ рдореВрд╡_рдЖрдИрдПрдл_рдЖрд░рдЖрд░ рдХреНрдпрд╛ рд╣реИ:
рдпрд╣ std рдХрд╛ рдПрдХ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рд╕рдВрд╕реНрдХрд░рдг рд╣реИ :: рдЖрдЧреЗ: std рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП :: рдЖрдЧреЗ, рдЖрдк рдЯреЗрдореНрдкрд▓реЗрдЯ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рдкреНрд░рдХрд╛рд░ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рджреВрд╕рд░рд╛ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ, Move_if_rr рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рддрд╛ рд╣реИред рдХреНрдпреЛрдВ?
рдХреНрдпреЛрдВрдХрд┐ рдпрджрд┐ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреЛ рдореЗрд░реЗ рд▓рд┐рдП rvalue рд▓рд┐рдВрдХ рджреНрд╡рд╛рд░рд╛ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рддреЛ рдЗрд╕рдХреЗ рд╕рднреА рдЖрдВрддрд░рд┐рдХ рдШрдЯрдХреЛрдВ рдХреЛ рднреА rvalue рд▓рд┐рдВрдХ рджреНрд╡рд╛рд░рд╛ рдкрд╛рд░рд┐рдд рдорд╛рдирд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдХреЗрд╡рд▓ рдпрд╣рд╛рдБ рдпрд╣ рд╣реИ рдХрд┐ рдЗрд╕реЗ рд╕рдВрдХрд▓рдХ рдХреЛ рдХреИрд╕реЗ рд╕рдордЭрд╛рдпрд╛ рдЬрд╛рдП, рдЕрдЧрд░ рдореИрдВрдиреЗ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдпрд╣ рд╕рдВрдХреЗрдд рдирд╣реАрдВ рджрд┐рдпрд╛ рдХрд┐ рдпрд╣ рд╡рд┐рд╢реЗрд╖ рдкреНрд░рдХрд╛рд░ рдореБрдЭреЗ рдХреИрд╕реЗ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рд▓реЗрдХрд┐рди рдорд╛рдирдХ рдЖрдЧреЗ рд╕рдВрдХреЗрддрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛?
рдПрдХ рдЙрджрд╛рд╣рд░рдг:
рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рдРрд╕рд╛ рдХреЛрдИ рд╕рдорд╛рд░реЛрд╣ рдерд╛:
рдЯреЗрдореНрдкрд▓реЗрдЯ < рд╡рд░реНрдЧ рдЯреА >
рд╢реВрдиреНрдп f ( T && rr )
{
SendData ( std :: рдЖрдЧреЗ < T > ( rr ) ) ;
}
рдФрд░ рдлрд┐рд░ рдХрд╛рд░реНрдпрдХреНрд░рдо рдореЗрдВ рдХреБрдЫ рдмрджрд▓ рдЧрдпрд╛, рдФрд░ рдПрдХ рд╕рдордЧреНрд░ рдкреНрд░рдХрд╛рд░ рдЗрд╕рдореЗрдВ рдЖрдиреЗ рд▓рдЧрд╛ (рдЗрд╕рдореЗрдВ рдкреБрд░рд╛рдирд╛ рдкреНрд░рдХрд╛рд░ рдПрдХ рдХреНрд╖реЗрддреНрд░ рдХреА рддрд░рд╣ рд╣реИ)ред рдЗрд╕ рдХреНрд╖реЗрддреНрд░ рдХреЛ рдЕрдЧреНрд░реЗрд╖рдг рдХреЗ рд╕рд╛рде рдХреИрд╕реЗ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдП, рдкрд╣рд▓реЗ рдХреА рддрд░рд╣? C Move_if_rr рдРрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ:
рдЯреЗрдореНрдкрд▓реЗрдЯ < рд╡рд░реНрдЧ рдЯреА >
рд╢реВрдиреНрдп f ( T && rr )
{
SendData ( std :: Move_if_rr < T > ( rrред GetSomeElement ( ) ) ) ;
}

UPD 3. рд╕реНрдерд┐рддрд┐ рдереЛрдбрд╝реА рдкреИрд░рд╛рдлреНрд░реЗрд╕реНрдб рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдкрд┐рдЫрд▓реЗ рд╕реВрддреНрд░реАрдХрд░рдг рдиреЗ рд╣рдореЗрдВ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░реЛрдВ рдХреЗ рд╢рдмреНрджрд╛рд░реНрде (Fwd рдХреЗ рдмрдЬрд╛рдп, рдПрдХ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛) рд╕реЗ рдЪрд┐рдкрдХреЗ рд░рд╣рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреАред

UPD 4. рдЖрдк рдЗрд╕ рдХреЛрдб рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рдЗрд╕реЗ рдбрд╛рд▓рдХрд░ рд╕рдорд╛рдзрд╛рди рдХреА рдЬрд╛рдБрдЪ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рд╣реА рд╕рдВрд╕реНрдХрд░рдг рдпрд╣рд╛рдБ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ , рд╡рд╣рд╛рдБ рднреА рдПрдХ рд╡рд┐рдХрд▓реНрдк рд╣реИ SergX - mpl рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдмрд┐рдирд╛

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


All Articles