рдирдпрд╛ рднрд╛рд╖рд╛ рдорд╛рдирдХ рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рдкрд╣рд▓реЗ рдФрд░ рдЕрдм рдЕрдкрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд╢рд╛рдпрдж, рдРрд╕рд╛ рдХреЛрдИ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдирд╣реАрдВ рд╣реИ рдЬрд┐рд╕рдиреЗ рдирдП рдХреАрд╡рд░реНрдбреНрд╕
рдСрдЯреЛ рдФрд░
рдШреЛрд╖рдгрд╛рдкрддреНрд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рд╕реБрдирд╛ рд╣реИред рд▓реЗрдХрд┐рди C ++ рдХреЗ рд▓рдЧрднрдЧ рд╣рд░ рдкрд╣рд▓реВ рдХреЗ рд╕рд╛рде, рдЗрди рдирдП рдЙрдкрдХрд░рдгреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЗрд╕рдХреА рдмрд╛рд░реАрдХрд┐рдпреЛрдВ рдХреЗ рдмрд┐рдирд╛ рдирд╣реАрдВ рд╣реИред рдореИрдВ рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдЙрдирдореЗрдВ рд╕реЗ рдХреБрдЫ рдХреЛ рдЙрдЬрд╛рдЧрд░ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реВрдВрдЧрд╛ред
рд╡рд╛рд░реНрдо рдЕрдк рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВ рд╕реБрдЭрд╛рд╡ рджреЗрддрд╛ рд╣реВрдВ рдХрд┐ рдПрдХ рдЫреЛрдЯреЗ рдкрд░реАрдХреНрд╖рдг рд╕реЗ рд╢реБрд░реВ рдХрд░реЗрдВред
рдХрд╕реМрдЯреА
1. рдирд┐рдореНрди рдХреЛрдб рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж ri1..riN рдЪрд░ рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╣реЛрдЧрд╛?
int foo(); int& foo1(); const int foo2(); const int& foo3(); int main() { auto ri = foo(); auto ri1 = foo1(); auto ri2 = foo2(); auto ri3 = foo3(); auto& ri4 = foo(); auto& ri5 = foo1(); auto& ri6 = foo2(); auto& ri7 = foo3(); auto&& ri8 = foo(); auto&& ri9 = foo1(); auto&& ri10 = foo2(); auto&& ri11 = foo3(); int k = 5; decltype(k)&& rk = k; decltype(foo())&& ri12 = foo(); decltype(foo1())&& ri13 = foo1(); int i = 3; decltype(i) ri14; decltype((i)) ri15; }
рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕реНрдирд┐рдкреЗрдЯ рд╕рдВрдХрд▓рди рдХрд░реЗрдВрдЧреЗ?
2. auto lmbd = [](auto i){...}; 3. void foo(auto i); 4. decltype(auto) var = some_expression;
рд╕рд┐рджреНрдзрд╛рдВрдд
C ++ 11:
рдСрдЯреЛ рдФрд░
рдбрд┐рдХреНрд▓реЗрдкрдЯ рдореЗрдВ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдкреНрд░рдХрд╛рд░ рдХреЗ
рдЗрдиреНрд╡реЗрдВрд╢рди рддрдВрддреНрд░ рдореЗрдВ рджреЛ рдирдП рддрдВрддреНрд░ рдЬреЛрдбрд╝реЗ рдЧрдП рд╣реИрдВред рдФрд░ рдЗрд╕рд▓рд┐рдП рдХрд┐ рдЬреАрд╡рди рдХреЗ рд▓рд┐рдП рдкреНрд░реЛрдЧреНрд░рд╛рдорд░реЛрдВ рдХреЛ рд╢рд╣рдж рдирд╣реАрдВ рд▓рдЧрддрд╛ рд╣реИ, рдпреЗ рд╕рднреА 3 рддрдВрддреНрд░ рдЕрдкрдиреЗ рддрд░реАрдХреЗ рд╕реЗ рдЯрд╛рдЗрдк рдХрд░рддреЗ рд╣реИрдВред
рдСрдЯреЛ рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдиреЗ рд╡рд╛рд▓рд╛ рддрдВрддреНрд░ рдЦрд╛рдХрд╛ рдЗрдВрдЬрди рдХреА рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдмрдирд╛рддрд╛ рд╣реИ, рдкреНрд░рдХрд╛рд░
std :: initializer_list рдХреЛ рдЫреЛрдбрд╝рдХрд░ред
auto var = {1, 2, 3};
рдЗрд╕ рддрд░рд╣ рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рд╣реИрдВ рдФрд░ рд╡реЗ рд╕рднреА рд╕рдордЭрджрд╛рд░реА рдореЗрдВ рднрд┐рдиреНрди рдирд╣реАрдВ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╕реНрдХреЙрдЯ рдореЗрдпрд░реНрд╕, рдЗрд╕ рд╡рд┐рд╖рдп рдкрд░ рд▓рд┐рдЦрддреЗ рд╣реИрдВ:
тАЬрдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдСрдЯреЛ рдХреЗ рд▓рд┐рдП рдФрд░ рдЯреЗрдореНрдкрд▓реЗрдЯреНрд╕ рдХреЗ рд▓рд┐рдП рдХрдЯреМрддреА рдХреНрдпреЛрдВ рд╕рдорд╛рди рдирд╣реАрдВ рд╣реИред рдпрджрд┐ рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ, рддреЛ рдХреГрдкрдпрд╛ рдореБрдЭреЗ рдмрддрд╛рдПрдВ! тАЭ ред C ++ 14 рдореЗрдВ, рдпрд╣ рддрдВрддреНрд░ рдмрджрд▓рдиреЗ рд╡рд╛рд▓рд╛ рдирд╣реАрдВ рд╣реИред рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рдХреЗ рд▓рд┐рдП, рдХреЛрдИ рднреА рдЗрд╕ рддрдереНрдп рдХреЛ рд▓реЗ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдРрд╕реА рдЕрджреНрднреБрдд рдЪреАрдЬреЗрдВ рдХрд╛рдо рдХрд░рддреА рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:
template<typename T> void fill_from_list(T& cont, const T& l); std::vector<int> v; fill_from_list(v, {1, 2, 3});
рдСрдЯреЛ
рддреЛ `рдСрдЯреЛ` рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреИрд╕реЗ рдШрдЯрд╛рддрд╛ рд╣реИ? рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рд╕рднреА рдЕрд╡рд╕рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рд╕рд░рд▓ рдирд┐рдпрдо рдирд╣реАрдВ рд╣реИ, рд╕рд┐рд╡рд╛рдп, рд╢рд╛рдпрдж, рдХрд┐ `рдСрдЯреЛ` рдЬрдм рдЯрд╛рдЗрдк рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдЖрдорддреМрд░ рдкрд░ рд╕реАрд╡реА рдХреНрд╡рд╛рд▓реАрдлрд╛рдпрд░ рдФрд░ рд▓рд┐рдВрдХ рдХреЛ рдЫреЛрдбрд╝рддреЗ рд╣реИрдВред рдиреАрдЪреЗ рдореИрдВ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд┐рдВрджреБрдУрдВ рдХреА рд╕реВрдЪреА рджреВрдВрдЧрд╛ред
1ред
auto var = some_expression;
рдпрджрд┐ рдЯрд╛рдЗрдк
some_expression T * рдпрд╛
const T * рд╣реИ , рддреЛ рдЯрд╛рдЗрдк var рдХреНрд░рдорд╢рдГ
T * рдпрд╛
const T * рднреА рд╣реЛрдЧрд╛ред рдЕрдм рддрдХ рдХреЛрдИ рдЖрд╢реНрдЪрд░реНрдп рдирд╣реАрдВ рд╣реБрдЖред рдЕрдзрд┐рдХ рджрд┐рд▓рдЪрд╕реНрдк рд╣реИред рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ рд╢рд╛рдпрдж рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд┐рдпрдо рдпрд╣ рд╣реИ рдХрд┐ рдЕрдЧрд░
some_expression рдХрд╛ рдкреНрд░рдХрд╛рд░
T ,
const T ,
T & const рдпрд╛
const T рд╣реИ ,
рддреЛ var рдХрд╛ рдкреНрд░рдХрд╛рд░ T рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдпрджрд┐ рдЖрдк рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдХрд╛рдлреА рддрд╛рд░реНрдХрд┐рдХ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ
some_expression рджреНрд╡рд╛рд░рд╛ рд▓реМрдЯрд╛рдП рдЧрдП рдорд╛рди рдХреЛ var рдкрд░ рдХреЙрдкреА рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЖрдк рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рдЗрд╕ рддрд░рд╣ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ:
void foo(const std::list<widget_t>& l) { auto w = l.front(); l.pop();
2ред
auto& var = some_expression;
рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ рдЙрдореНрдореАрдж рдХреА рдЬрд╛рддреА рд╣реИ рдХрд┐ рдпрджрд┐ рдЯрд╛рдЗрдк
some_expression T рдпрд╛
const T рд╣реИ , рддреЛ рдпрд╣ рд╕рдВрдХрд▓рди рдирд╣реАрдВ рдХрд░реЗрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐
lvalue рд▓рд┐рдВрдХ рдХреЛ
rvalue рдХреЗ рд╕рд╛рде рдЖрд░рдВрдн рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрджрд┐
some_expression рдХрд╛ рдкреНрд░рдХрд╛рд░
T & рд╣реИ , рддреЛ var рднреА
T & рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╣реЛрдЧрд╛ред рдпрд╣рд╛рдБ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд┐рдВрджреБ рдпрд╣ рд╣реИ рдХрд┐ рдЕрдЧрд░
some_expression рдХрд╛ рдкреНрд░рдХрд╛рд░
const T & рд╣реИ , рддреЛ var рдХрд╛ рдкреНрд░рдХрд╛рд░
const T & рд╣реЛрдЧрд╛ ред
3ред
auto&& var = some_expression;
рд╕реНрдХреЙрдЯ рдореЗрдпрд░реНрд╕ рджреНрд╡рд╛рд░рд╛ рд▓рд╛рдЧреВ (рдпрд╛ рдХрдо рд╕реЗ рдХрдо рдЖрд╡рд╛рдЬ рджреНрд╡рд╛рд░рд╛) "рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рд▓рд┐рдВрдХ" рдХрд╛ рдирд┐рдпрдо рдпрд╣рд╛рдВ рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИред рдпрд╣ рдЗрд╕ рддрдереНрдп рдореЗрдВ
рд╕рдореНтАНрдорд┐рд▓рд┐рдд рд╣реИ рдХрд┐ рдкреНрд░рдХрд╛рд░
var рдХреБрдЫ
рд╢реНрд░реЗрдгреА рдХреЗ рдорд╛рди рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░реЗрдЧрд╛ рдЬреЛ
some_expression рд╣реИ ред рдпрджрд┐
rvalue рд╣реИ , рддреЛ рдкреНрд░рдХрд╛рд░
var T && рд╣реЛрдЧрд╛ , рдпрджрд┐
lvalue , рддреЛ
T && ред
Cv рдХреНрд╡рд╛рд▓рд┐рдлрд╛рдпрд░ рд╕рд╣реЗрдЬреЗ рдЬрд╛рддреЗ рд╣реИрдВред
рдлрд╝рдВрдХреНрд╢рди рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдСрдЯреЛ
рдСрдЯреЛ рдХреЛ рдлрдВрдХреНрд╢рди рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЗрд╕реНрддреЗрдорд╛рд▓ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдЗрд╕ рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рдХреЛрдИ рдмрджрд▓рд╛рд╡ рдХреА рдЙрдореНрдореАрдж рдирд╣реАрдВ рд╣реИред рдЬрд╛рд╣рд┐рд░ рд╣реИ, рдпрд╣рд╛рдБ рдореБрджреНрджрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдЕрдЧрд░ рдпрд╣ рдЕрдиреБрдорддрд┐ рджреА рдЧрдИ рдереА, рддреЛ рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ рдХрд┐рд╕реА рднреА рд╕рд╛рдорд╛рдиреНрдп рдХрд╛рд░реНрдп рдХреЛ рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдЯреЗрдореНрдкрд▓реЗрдЯ рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдФрд░ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реЛ рдкрд╛рддрд╛ рд╣реИ рдХрд┐ рдУрд╡рд░рд▓реЛрдб рдХреА рдЕрдиреБрдорддрд┐ рдХреИрд╕реЗ рджреА рдЬрд╛рдПред рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдХреА рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ:
auto foo(auto v1, auto v2) -> decltype(v1+v2) ; int foo(auto v1, bool v2); foo(тАЬC++ is cool?тАЭ, true);
рд╣рд╛рд▓рд╛рдВрдХрд┐, c ++ 14 рдореЗрдВ рд▓реИрдореНрдмреНрдбрд╛ рдореЗрдВ
рдСрдЯреЛ рдорд╛рдкрджрдВрдбреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реЛрдЧрд╛ред
decltype
рдШреЛрд╖рдгрд╛рдкрддреНрд░ рдХреЗ рд╕рд╛рде
, рдПрдХ рддрд░рдл рд╕реНрдерд┐рддрд┐ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╣реЛрддреА рд╣реИ (рдпрджрд┐ рдЖрдк рдФрдкрдЪрд╛рд░рд┐рдХ рдирд┐рдпрдореЛрдВ рдХреЛ рджреЗрдЦреЗрдВ), рджреВрд╕рд░реА рддрд░рдл рдпрд╣ рдЖрд╕рд╛рди рд╣реИ (рдпрджрд┐ рдЖрдк рдореБрдЦреНрдп рдмрд┐рдВрджреБрдУрдВ рдХреЛ рдЙрдЬрд╛рдЧрд░ рдХрд░рддреЗ рд╣реИрдВ)ред рдореИрдВ рдЗрди рдирд┐рдпрдореЛрдВ рдХреЛ рддреИрдпрд╛рд░ рдХрд░реВрдВрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рдореИрдВрдиреЗ рдЙрдиреНрд╣реЗрдВ рд╕рдордЭрд╛ рдерд╛ред
рдЗрд╕рд▓рд┐рдП, рд╣рдореЗрдВ
рдбрд┐рдХреНрд▓реЗрд░реЗрд╢рди рдХреЗ рджреЛ рдореБрдЦреНрдп рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдЕрдВрддрд░ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред
1. рдЬрдм рдПрдХ рдШреЛрд╖рд┐рдд рдЪрд░ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдпрд╛ рдПрдХ рд╡рд░реНрдЧ рдХреЗ рд╕рджрд╕реНрдп рдХреЗ рд░реВрдк рдореЗрдВ
) рдбрд┐рдХреНрд▓реЗрдкрдЯ (рд╕рдВрд╕реНрдХрд░рдг )ред рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ,
рдбрд┐рдХреНрд╡реЗрд╕реНрдЯ (var) рдореЗрдВ рд╡реИрд╕рд╛ рд╣реА рдкреНрд░рдХрд╛рд░ рд╣реЛрдЧрд╛ рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рд╡реИрд░рд┐рдПрдмрд▓ рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
2.
рдШреЛрд╖рдгрд╛ (expr) ,
expr рдПрдХ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╣реИред рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ,
рдШреЛрд╖рдгрд╛рдкрддреНрд░ (expr) рд╡рд╣ рдкреНрд░рдХрд╛рд░ рд╣реЛрдЧрд╛, рдЬрд┐рд╕рд╕реЗ
рдпрд╣ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╡рд╛рдкрд╕ рдЖ рд╕рдХрддреА рд╣реИ , рд╕рд╛рде рд╣реА
рдкреНрд░реЛрд╡рд┐рдЯрд╛рдЗрдк (expr) рдЯрд╛рдЗрдк
T & (
const T & ) рдХрд╛ рд╣реЛрдЧрд╛, рдЕрдЧрд░
expr рдПрдХ
рд▓реИрд╡рд▓реНрдпреВ рд▓реМрдЯрд╛рддрд╛ рд╣реИ,
T рдпрджрд┐
rr рдЯрд╛рдЗрдк
T рдХрд╛ рд░рд┐рдЯрд░реНрди рджреЗрддрд╛ рд╣реИ ( рдпрджрд┐
рдЯреАрдЖрд░рдкреА рдПрдХреНрд╕рдПрдВрдбрдЯреА (
рдЯреАрдПрдВрдбрд╕реАрдкреА ) рдФрд░
рдЯреАрдПрдВрдбрд╕реА (
рдХрд╛рд╕реНрдЯ рдЯреАрдПрдВрдбрд╕реА )
рдПрдХреНрд╕рдлреНрд▓реВ (
рд░реЗрд╡рд▓реНрдпреВ рд░реЗрдлрд░реЗрдВрд╕ ) рджреЗрддрд╛ рд╣реИред
"рд╡рд╛рдкрд╕реА" рдХрд╛ рдХреНрдпрд╛ рдорддрд▓рдм рд╣реИ? рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐
рдбрд┐рдХреНрд▓реЗрдкреНрдЯ рдпрд╣ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрд╕рдХреЗ рдкрд╛рд╕ рдЧрдИ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред
рдХреБрдЫ рдЙрджрд╛рд╣рд░рдг рд╣реИрдВ:
int i; decltype(i);
рдЗрд╕ рдШрдЯрдирд╛ рдореЗрдВ рдХрд┐ рд╣рдо
рд▓рд╡рд▓реНрдпреВ рдХреЛ рдирд╣реАрдВ рдЬрд╛рдирддреЗ рд╣реИрдВ
, рдПрдХ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐,
рд░рд╡реИрд▓реНрдпреВ рдпрд╛
рдЬрд╝рд╡рд▓реНрдпреВ рд╣рдореЗрдВ рд▓реМрдЯрд╛ рджреЗрдЧрд╛, рдФрд░ рд╣рдо рдЯрд╛рдЗрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЖрдк рд▓рд┐рдВрдХ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ "рд╕реНрдкрд╖реНрдЯ" рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдорд╛рдирдХ
std :: remove_reference рдЯреЗрдореНрдкрд▓реЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдбрд┐рдХреНрд░рд┐рдкреНрдЯ (рдСрдЯреЛ)
рдпрд╣ рднрд╛рд╖рд╛ рдХрд╛ рдПрдХ рдирдпрд╛ "рдлреАрдЪрд░" рд╣реИ, рдЬрд┐рд╕реЗ C ++ 14 рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рдСрдЯреЛ рд╡реИрд░рд┐рдПрдмрд▓ рдХреА рдШреЛрд╖рдгрд╛ рдХрд░рддреЗ рд╕рдордп рдШреЛрд╖рд┐рдд рд╢рдмреНрджрд╛рд░реНрдереЛрдВ рдХреЛ рд╕рдВрд░рдХреНрд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдФрд░ рдЙрди рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдЬрд╣рд╛рдВ рд╣рдо рдЗрд╕ рддрдереНрдп рд╕реЗ рд╕рдВрддреБрд╖реНрдЯ рдирд╣реАрдВ рд╣реИрдВ рдХрд┐
рдСрдЯреЛ рд▓рд┐рдВрдХ рдФрд░ cv рдХреНрд╡рд╛рд▓реАрдлрд╛рдпрд░ рдФрд░ рд╕рдВрднрд╡рдд: рдирдП C ++ 14 рдлреАрдЪрд░ рдХреЗ рд╕рдВрдпреЛрдЬрди рдореЗрдВ рдлрд╝рдВрдХреНрд╢рди рджреНрд╡рд╛рд░рд╛ рд▓реМрдЯрд╛рдП рдЧрдП рдорд╛рди рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рдЖрдЙрдЯрдкреБрдЯ рдХрд░рддреЗ рд╣реИрдВред ред
const int&& foo(); auto i = foo();
рдЙрддреНрддрд░рд╛рд░реНрджреНрдз рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдо
рдбрд┐рдХреНрдЯрд╛рдЗрдк (рдлреВ) () рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ рдХрд┐ рдЕрдЧрд░
рдлреВ () рдХреЗ рдмрдЬрд╛рдп 2 рд▓рд╛рдЗрдиреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдереА, рдФрд░ рдРрд╕реЗ рд╕реА + + рдореЗрдВ рдЕрд╕рд╛рдорд╛рдиреНрдп рдирд╣реАрдВ рд╣реИрдВред
рдЙрддреНрддрд░
рдЦреИрд░, рдЕрдм, рд╕рд┐рджреНрдзрд╛рдВрдд рдХреЛ рдХреИрд╢ рдореЗрдВ рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдЖрдк рдкрд░реАрдХреНрд╖рдг рдкреНрд░рд╢реНрдиреЛрдВ рдХрд╛ рдЙрддреНрддрд░ рджреЗрдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
1ред
int foo(); int& foo1(); const int foo2(); const int& foo3(); int main() { auto ri = foo();
рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕реНрдирд┐рдкреЗрдЯ рд╕рдВрдХрд▓рди рдХрд░реЗрдВрдЧреЗ?
2. auto lmbd = [](auto i){...};