рд░рд╣рд╕реНрдп рдСрдЯреЛ рдФрд░ рдШреЛрд╖рдгрд╛

рдирдпрд╛ рднрд╛рд╖рд╛ рдорд╛рдирдХ рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рдкрд╣рд▓реЗ рдФрд░ рдЕрдм рдЕрдкрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд╢рд╛рдпрдж, рдРрд╕рд╛ рдХреЛрдИ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдирд╣реАрдВ рд╣реИ рдЬрд┐рд╕рдиреЗ рдирдП рдХреАрд╡рд░реНрдбреНрд╕ рдСрдЯреЛ рдФрд░ рдШреЛрд╖рдгрд╛рдкрддреНрд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рд╕реБрдирд╛ рд╣реИред рд▓реЗрдХрд┐рди 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; //WTF?! 5. auto var = {1, 2, 3}; // ,     var? 6. template<typename T> void foo(T t){} foo({1, 2, 3}); 

рд╕рд┐рджреНрдзрд╛рдВрдд

C ++ 11: рдСрдЯреЛ рдФрд░ рдбрд┐рдХреНрд▓реЗрдкрдЯ рдореЗрдВ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЗрдиреНрд╡реЗрдВрд╢рди рддрдВрддреНрд░ рдореЗрдВ рджреЛ рдирдП рддрдВрддреНрд░ рдЬреЛрдбрд╝реЗ рдЧрдП рд╣реИрдВред рдФрд░ рдЗрд╕рд▓рд┐рдП рдХрд┐ рдЬреАрд╡рди рдХреЗ рд▓рд┐рдП рдкреНрд░реЛрдЧреНрд░рд╛рдорд░реЛрдВ рдХреЛ рд╢рд╣рдж рдирд╣реАрдВ рд▓рдЧрддрд╛ рд╣реИ, рдпреЗ рд╕рднреА 3 рддрдВрддреНрд░ рдЕрдкрдиреЗ рддрд░реАрдХреЗ рд╕реЗ рдЯрд╛рдЗрдк рдХрд░рддреЗ рд╣реИрдВред рдСрдЯреЛ рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдиреЗ рд╡рд╛рд▓рд╛ рддрдВрддреНрд░ рдЦрд╛рдХрд╛ рдЗрдВрдЬрди рдХреА рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдмрдирд╛рддрд╛ рд╣реИ, рдкреНрд░рдХрд╛рд░ std :: initializer_list рдХреЛ рдЫреЛрдбрд╝рдХрд░ред

 auto var = {1, 2, 3}; // Ok, var    std::initializer_list<int> template<typename T> void foo(T t); foo({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(); // work with `w` here } 


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); // int decltype(i + 1); // int decltype((i)); // int& decltype(i = 4); //int& const int foo(); decltype(foo()) ;// int int&& foo1(); decltype(foo1()) ;// int&& 


рдЗрд╕ рдШрдЯрдирд╛ рдореЗрдВ рдХрд┐ рд╣рдо рд▓рд╡рд▓реНрдпреВ рдХреЛ рдирд╣реАрдВ рдЬрд╛рдирддреЗ рд╣реИрдВ , рдПрдХ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐, рд░рд╡реИрд▓реНрдпреВ рдпрд╛ рдЬрд╝рд╡рд▓реНрдпреВ рд╣рдореЗрдВ рд▓реМрдЯрд╛ рджреЗрдЧрд╛, рдФрд░ рд╣рдо рдЯрд╛рдЗрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЖрдк рд▓рд┐рдВрдХ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ "рд╕реНрдкрд╖реНрдЯ" рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдорд╛рдирдХ std :: remove_reference рдЯреЗрдореНрдкрд▓реЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдбрд┐рдХреНрд░рд┐рдкреНрдЯ (рдСрдЯреЛ)

рдпрд╣ рднрд╛рд╖рд╛ рдХрд╛ рдПрдХ рдирдпрд╛ "рдлреАрдЪрд░" рд╣реИ, рдЬрд┐рд╕реЗ C ++ 14 рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдСрдЯреЛ рд╡реИрд░рд┐рдПрдмрд▓ рдХреА рдШреЛрд╖рдгрд╛ рдХрд░рддреЗ рд╕рдордп рдШреЛрд╖рд┐рдд рд╢рдмреНрджрд╛рд░реНрдереЛрдВ рдХреЛ рд╕рдВрд░рдХреНрд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдФрд░ рдЙрди рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдЬрд╣рд╛рдВ рд╣рдо рдЗрд╕ рддрдереНрдп рд╕реЗ рд╕рдВрддреБрд╖реНрдЯ рдирд╣реАрдВ рд╣реИрдВ рдХрд┐ рдСрдЯреЛ рд▓рд┐рдВрдХ рдФрд░ cv рдХреНрд╡рд╛рд▓реАрдлрд╛рдпрд░ рдФрд░ рд╕рдВрднрд╡рдд: рдирдП C ++ 14 рдлреАрдЪрд░ рдХреЗ рд╕рдВрдпреЛрдЬрди рдореЗрдВ рдлрд╝рдВрдХреНрд╢рди рджреНрд╡рд╛рд░рд╛ рд▓реМрдЯрд╛рдП рдЧрдП рдорд╛рди рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рдЖрдЙрдЯрдкреБрдЯ рдХрд░рддреЗ рд╣реИрдВред ред
 const int&& foo(); auto i = foo(); // i    int dectype(auto) i2 = foo(); // i2    const int&& 

рдЙрддреНрддрд░рд╛рд░реНрджреНрдз рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдо рдбрд┐рдХреНрдЯрд╛рдЗрдк (рдлреВ) () рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ рдХрд┐ рдЕрдЧрд░ рдлреВ () рдХреЗ рдмрдЬрд╛рдп 2 рд▓рд╛рдЗрдиреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдереА, рдФрд░ рдРрд╕реЗ рд╕реА + + рдореЗрдВ рдЕрд╕рд╛рдорд╛рдиреНрдп рдирд╣реАрдВ рд╣реИрдВред

рдЙрддреНрддрд░

рдЦреИрд░, рдЕрдм, рд╕рд┐рджреНрдзрд╛рдВрдд рдХреЛ рдХреИрд╢ рдореЗрдВ рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдЖрдк рдкрд░реАрдХреНрд╖рдг рдкреНрд░рд╢реНрдиреЛрдВ рдХрд╛ рдЙрддреНрддрд░ рджреЗрдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

1ред
 int foo(); int& foo1(); const int foo2(); const int& foo3(); int main() { auto ri = foo(); // int auto ri1 = foo1(); // int auto ri2 = foo2(); // int auto ri3 = foo3(); // int auto& ri4 = foo(); //   auto& ri5 = foo1(); // int& auto& ri6 = foo2(); //   auto& ri7 = foo3(); // const int& auto&& ri8 = foo(); // int&& auto&& ri9 = foo1(); // int& auto&& ri10 = foo2(); // const int&& auto&& ri11 = foo3(); // const int& int k = 5; decltype(k)&& rk = k; //   decltype(foo())&& ri12 = foo(); // int&& decltype(foo1())&& ri13 = foo1(); // int& int i = 3; decltype(i) ri14; // int decltype((i)) ri15; // int& } 

рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕реНрдирд┐рдкреЗрдЯ рд╕рдВрдХрд▓рди рдХрд░реЗрдВрдЧреЗ?

 2. auto lmbd = [](auto i){...}; //  - ,   ++14 -  3. void foo(auto i); //  4. decltype(auto) var = some_expression; // ,  ++14 5. auto var = {1, 2, 3}; // ,  = std::initializer_list<int> 6. template<typename T> void foo(T t){} foo({1, 2, 3}); //  

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


All Articles