рдХрдИ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ, рд╡рд╕реНрддреБрдУрдВ рдФрд░ рдЪрд░ рдХреЛ рдирд┐рд░рдВрддрд░ рдШреЛрд╖рд┐рдд рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИред рдФрд░, рддрджрдиреБрд╕рд╛рд░, рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд┐рдлрд╛рд░рд┐рд╢реЗрдВ рд╣реИрдВ рдпрджрд┐ рдЖрдк рдЙрдирдХреЗ рдореВрд▓реНрдпреЛрдВ рдХреЛ рдмрджрд▓рдиреЗ рдирд╣реАрдВ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВред рдирдП рдорд╛рдирдХ рдХреЗ рдЖрдЧрдорди рдХреЗ рд╕рд╛рде, рд╕реА ++ рдореЗрдВ рдПрдХ рд╕рд┐рдлрд╛рд░рд┐рд╢ рджрд┐рдЦрд╛рдИ рдЧрдИ рд╣реИ рдХрд┐ рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдореВрд▓реНрдп рд╕реЗ рд╡рд╛рдкрд╕ рдХрд┐рдпрд╛ рдЬрд╛рдП, рдХреНрдпреЛрдВрдХрд┐
рдЖрд░рд╡реАрдУ рдХреЗ рдмрд┐рдирд╛ рднреА рдЖрдк рдЖрдВрджреЛрд▓рди рдХреЗ рд╢рдмреНрджрд╛рд░реНрде рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрджрд┐ рд╣рдо рдЗрди рджреЛ рд╕рд┐рдлрд╛рд░рд┐рд╢реЛрдВ рдХрд╛ рдПрдХ рд╕рд╛рде рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдХреНрдпрд╛ рд╣реЛрдЧрд╛: рдореВрд▓реНрдп рджреНрд╡рд╛рд░рд╛ рд╕реНрдерд┐рд░ рд╡рд╕реНрддреБ рд▓реМрдЯрд╛рдПрдВ? рдЖрдЗрдП рдЗрд╕реЗ рдЖрдЧреЗ рдЬрд╛рдирдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВред
рд╣рд╛рд▓ рд╣реА рдореЗрдВ C ++ рдХреЗ рд╕рдореНрдореЗрд▓рди рд╕реЗ рд╡реАрдбрд┐рдпреЛ рджреЗрдЦрдХрд░, рдореИрдВ рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рдмрд┐рдВрджреБ (рдЧрдбреНрдвреЗ) рдореЗрдВ рдЖрдпрд╛ред рднрд╛рд╖рдгреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХреЗ рдЕрдВрдд рдореЗрдВ, рд╕реНрдкреАрдХрд░ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рджреЗрддрд╛ рд╣реИ:
struct s { ... }; sf() { const sr; ...; return r; }
рдФрд░ рдкреВрдЫрддрд╛ рд╣реИ рдХрд┐ рдлрд╝рдВрдХреНрд╢рди рд╕реЗ рд╡рд╛рдкрд╕ рдЖрдиреЗ рдкрд░ рдСрдмреНрдЬреЗрдХреНрдЯ
r рдХрд╛ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ?
рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рдПрдХ рдХреЙрдкреА рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдФрд░ рдПрдХ рдореВрд╡ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рджреЛрдиреЛрдВ рд╣реИрдВ, рдФрд░ рдлрд╝рдВрдХреНрд╢рди
рдЪ рдореЗрдВ рдХреЛрдб рд╣реИ рдЬреЛ рдЖрд░рд╡реАрдУ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЛ рд░реЛрдХрддрд╛ рд╣реИред рдЬрдм рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рд╕реЗ рд╡рд╛рдкрд╕ рдЖрддрд╛ рд╣реИ рддреЛ рдСрдмреНрдЬреЗрдХреНрдЯ
r рдХрд╛ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ? рдпрджрд┐ рдСрдмреНрдЬреЗрдХреНрдЯ
рдХреЙрдиреНрд╕реНрдЯреЗрдмрд▓ рдХреЗ рдмрд┐рдирд╛ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рддреЛ рдЬрдм рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рд╕реЗ рд▓реМрдЯрддрд╛ рд╣реИ, рддреЛ рдЗрд╕реЗ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдФрд░ рдпрджрд┐
рдХреЙрдиреНрд╕реНрдЯ рдХреЗ рд╕рд╛рде рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рддреЛ рдЗрд╕реЗ
рдХреЙрдкреА рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЗрд╕реА рддрд░рд╣ рдХрд╛ рд╡реНрдпрд╡рд╣рд╛рд░ рдЬреАрд╕реАрд╕реА рдФрд░ рдХреНрд▓реИрдВрдЧ (рд╡рд┐рдЬреБрдЕрд▓ рд╕реНрдЯреВрдбрд┐рдпреЛ рдореЗрдВ рдореИрдВрдиреЗ рдЬрд╛рдВрдЪ рдирд╣реАрдВ рдХрд┐рдпрд╛) рдореЗрдВ рджреЗрдЦрд╛ рдЧрдпрд╛ рдерд╛ред рдпрд╣ рдХреНрдпрд╛ рд╣реИ: рдмрдЧ рдпрд╛ рдЕрдкреЗрдХреНрд╖рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░? рдпрджрд┐ рдХреЛрдИ рд╡рд╕реНрддреБ рддреБрд░рдВрдд рдирд╖реНрдЯ рд╣реЛ рдЬрд╛рддреА рд╣реИ, рддреЛ рдЙрд╕реЗ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХреНрдпреЛрдВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ?
C ++ 03 рдХреЗ рдмрд╛рдж рд╕реЗ, рд╣рдо рдореЗрдВ рд╕реЗ рдХрдИ рдЗрд╕ рддрдереНрдп рдХреЗ рдЖрджреА рд╣реИрдВ рдХрд┐ рдЕрд╕реНрдерд╛рдпреА рд╡рд╕реНрддреБрдПрдВ рдФрд░ рд╕реНрдерд┐рд░рд╛рдВрдХ рд▓рдЧрднрдЧ рдПрдХ рд╣реА рдЪреАрдЬ рд╣реИрдВред рдФрд░ рдпрд╣ рддрд░реНрдХрд╕рдВрдЧрдд рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЙрди рджреЛрдиреЛрдВ рдХрд╛ рд╡реНрдпрд╡рд╣рд╛рд░ рд╕рдорд╛рди рдерд╛: рдЙрдиреНрд╣реЛрдВрдиреЗ рдЖрдкрдХреЛ рдХреЗрд╡рд▓ рдЙрди рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреА рдереА рдЬреЛ рдореВрд▓реНрдп рдпрд╛ рдирд┐рд░рдВрддрд░ рд╕рдВрджрд░реНрдн рджреНрд╡рд╛рд░рд╛ рддрд░реНрдХ рд▓реЗрддреЗ рд╣реИрдВ (рдпрд╛ рдмрд╕ рдЗрди рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рдореВрд▓реНрдпреЛрдВ рдХреЛ рдЕрд╕рд╛рдЗрди рдХрд░рддреЗ рд╣реИрдВ):
void f1(int a) { } void f2(int& a) { } void f3(const int& a) { } int g() { return 0; } int main() { f1(g());
C ++ 11 рдореЗрдВ, рд╕реНрдерд┐рддрд┐ рдмрджрд▓ рдЧрдИ рд╣реИ: рдЕрдм рд╣рдо rvalue рд╕рдВрджрд░реНрднреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрд╕реНрдерд╛рдпреА рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдирд┐рд░рдВрддрд░ рдирд╣реАрдВред рдорд╛рдирдХ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдХреЙрдиреНрд╕реНрдЯреЗрдВрдЯ рд╕реНрдкреЗрд╕рд┐рдлрд╝рд░ рдХреЗ рд╕рд╛рде рдШреЛрд╖рд┐рдд рд╡рд╕реНрддреБрдУрдВ рдореЗрдВ рдХреЛрдИ рднреА рдмрджрд▓рд╛рд╡ (рдЪрд╛рд╣реЗ рд╡рд╣ рдкреЙрдЗрдВрдЯрд░реНрд╕ рдХреЗ рд╕рд╛рде рдХреЙрдиреНрд╕реНрдЯреИрдХ рдпрд╛ рдкреЙрд╡рд░реНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реЛ) рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рдХреА рдУрд░ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рдпрджрд┐ рдХрдВрдкрд╛рдЗрд▓рд░ рдиреЗ рдЪрд╛рд▓ рдирд┐рд░реНрдорд╛рдгрдХрд░реНрддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреЛрдб рдЙрддреНрдкрдиреНрди рдХрд┐рдпрд╛, рддреЛ рдпрд╣ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЛ рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдбрд╛рд▓ рджреЗрдЧрд╛, рдЬреЛ рдЕрд╕реНрд╡реАрдХрд╛рд░реНрдп рд╣реИред рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рд╕рдорд╛рди рдЕрдиреБрдХреВрд▓рди рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЗ рд▓рд┐рдП рдХреЙрд╕реНрдЯ-рд╢реБрджреНрдзрддрд╛ рдХреА рдЕрдзрд┐рдХ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рд╣реИред рдлрд┐рд░ рднреА, C ++ рдПрдХ рджреГрдврд╝рддрд╛ рд╕реЗ рдЯрд╛рдЗрдк рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рднрд╛рд╖рд╛ рд╣реИ рдФрд░
рдХреЙрдиреНрд╕реНрдЯреЗрдВрд╕ рд╕реЗ рдиреЙрд░реНрдорд▓ рддрдХ рдХреЗ рд░реЗрдлрд░реЗрдВрд╕ рдФрд░ рдкреЙрдЗрдВрдЯрд░реНрд╕ рдХреА рдХреЛрдИ рднреА рдирд┐рд╣рд┐рдд рдХрд╛рд╕реНрдЯ рд╡рд░реНрдЬрд┐рдд рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:
const A a -> A && ред
рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:
void f1(int& a) { } void f2(const int& a) { } int main() { int a1 = 0; f1(a1);
C ++ рдорд╛рдирдХ рдСрдмреНрдЬреЗрдХреНрдЯ рд╕реЗ рдХреНрд╡рд╛рд▓рд┐рдлрд╛рдпрд░ рд╣рдЯрд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИред рдпрджрд┐
A рдХрд╛ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдкреНрд░рдХрд╛рд░
A рдФрд░ A рджреЛрдиреЛрдВ рдХреЛ рдХрдо рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░
A & рдХреЛ
рдХрдмреНрдЬ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рддреЛ
const A рдХреЛ рдХреЗрд╡рд▓
A & рдХреЛ рдХрдо рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЕрдм рд▓рд┐рдВрдХ рдХреЗ rvalue рдХреЗ рд╕рд╛рде рд▓рд┐рдВрдХ рдХреЗ lvalue рдХреЛ
std рдЬреЛрдбрд╝рдХрд░ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ: рдлрдВрдХреНрд╢рди рдореЗрдВ рдкреИрд░рд╛рдореАрдЯрд░ рдкрд╛рд╕ рдХрд░рддреЗ рд╕рдордп рдХреЙрд▓ рдХрд░реЗрдВ ... рдЕрддреНрдпрдзрд┐рдХ! рд╣рдо рдХрд╛рд╕реНрдЯ
рдП рдХреЛ
рдП рдФрд░ рдП рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рдбрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╣рдо
рдПрдПрдВрдбрдЯреА рдХреЛ
рдХрд╛рд╕реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрджрд┐ рдЖрдк рдРрд╕рд╛ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рд▓рд┐рдЦрддреЗ рд╣реИрдВ, рддреЛ рдХрдВрдкрд╛рдЗрд▓рд░ рдлрд╝рдВрдХреНрд╢рдВрд╕ рд╕реЗ рд▓рдЧрд╛рддрд╛рд░ рд╡реИрд░рд┐рдПрдмрд▓ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдирд┐рдпрдорд┐рдд рдХреЙрдкреА рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рд╕рдордЭ рдореЗрдВ рдирд╣реАрдВ рдЖрддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдВрдХ рдХрд╛ рдЖрдорддреМрд░ рдкрд░ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдирд┐рд╖реНрдХрд░реНрд╖
рдЬреИрд╕рд╛ рдХрд┐ рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ, рдХреБрдЫ рдЕрдиреБрд╢рдВрд╕рд┐рдд рдкреНрд░рдерд╛рдУрдВ рдХреЛ рд╕рдВрдпреБрдХреНрдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рд╕реА ++ рдореЗрдВ, рдЖрдкрдХреЛ рд▓рдЧрд╛рддрд╛рд░ рдпрд╣рд╛рдВ рдФрд░ рд╡рд╣рд╛рдВ рджреЗрдЦрдирд╛ рд╣реЛрдЧрд╛, рддрд╛рдХрд┐ рдХрд┐рд╕реА рдЕрдиреНрдп рдиреБрдХрд╕рд╛рди рдкрд░ рдареЛрдХрд░ рди рдкрдбрд╝реЗред рдЕрдм рдЖрдкрдХреЛ рд╕реНрдерд┐рд░рд╛рдВрдХ рдХрд╛ рдкрд╛рд▓рди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рддрд╛рдХрд┐ рд╡реЗ рдЖрдкрдХреЗ рдЬреАрд╡рди рдХреЛ рдЬрдЯрд┐рд▓ рди рдХрд░реЗрдВред рдЖрдЦрд┐рд░рдХрд╛рд░, рдЗрд╕ рддрд░рд╣ рдХреЗ рдХреЛрдб рд╕реЗ рдХреЛрдИ рднреА рд╕реБрд░рдХреНрд╖рд┐рдд рдирд╣реАрдВ рд╣реИ (рдФрд░ рднрд▓реЗ рд╣реА рдЖрдк рдЖрд░рд╡реАрдУ рдкрд░ рднрд░реЛрд╕рд╛ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рд╕реЛрдЪрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдорд╛рдорд▓рд╛ рдЖрдкрдХреЗ рд▓рд┐рдП рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реИ, рдЖрдк рдЗрд╕ рдХрд╛рд░рдг рдХреА рддрд▓рд╛рд╢ рдореЗрдВ рдмрд╣реБрдд рд╕рдордп рдмрд┐рддрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдХреЛрдб
рдПрд╕ рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рдХреЛрдИ рдХреЙрдкреА рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдирд╣реАрдВ рд╣реИ рдпрд╛ рдирд╣реАрдВ):
struct s { ... }; s foo(); s bar() { const auto r = foo(); if (r.check_something()) throw std::exception(); return r; }
рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЗрд╕ рдХреЛрдб рдореЗрдВ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреА рдПрдХ рдкреНрд░рддрд┐ (рдПрдХ рдФрд░ рдиреБрдХрд╕рд╛рди) рд╣реИ:
s bar() { auto&& r = foo(); ...; return r; }
рдЗрд╕ рд╡рд┐рдХрд▓реНрдк рдХреЛ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рджреЗрдВ:
s bar() { auto r = foo(); ...; return r; }
рдпрд╛, рдХреЗрд╡рд▓ рдпрджрд┐ рдЖрдк рдкреНрд░рддреНрдпреЗрдХ рдЪрд╛рд▓ рдирд┐рд░реНрдорд╛рддрд╛ рдХреЛ рдорд╣рддреНрд╡ рджреЗрддреЗ рд╣реИрдВ:
s bar() { auto&& r = foo(); ...; return std::move(r); }
рдЯрд┐рдкреНрдкрдгреА
рдирд┐рдореНрди рдХреЛрдб рдХреЗ рд╕рд╛рде рдкрд┐рдЫрд▓реЗ рдЙрджрд╛рд╣рд░рдг рдХреЛ рднреНрд░рдорд┐рдд рди рдХрд░реЗрдВ рдЬреЛ рдПрдХ рд▓рд┐рдВрдХ рд▓рд┐рдВрдХ рд▓реМрдЯрд╛рддрд╛ рд╣реИ:
s&& bar() { auto&& r = foo(); ...; return std::move(r); }
рдРрд╕рд╛ рдХрднреА рди рдХрд░реЗрдВ, рдпрд╣рд╛рдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдирд╖реНрдЯ рдХреА рдЧрдИ рд╡рд╕реНрддреБ рдХрд╛ рд▓рд┐рдВрдХ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
рдФрд░ рдлреЛрд░реНрд╕ рдЖрдкрдХреЗ рд╕рд╛рде рд╣реЛ рд╕рдХрддреА рд╣реИ!