рджрд╕ рд╕реА ++ 11 рд╕реБрд╡рд┐рдзрд╛рдПрдБ рд╣рд░ рд╕реА ++ рдбреЗрд╡рд▓рдкрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП

рдпрд╣ рдЖрд▓реЗрдЦ рдХрдИ рд╕реА ++ 11 рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреА рдЪрд░реНрдЪрд╛ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рд╕рднреА рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЛ рдЬрд╛рдирдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рднрд╛рд╖рд╛ рдФрд░ рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ рдХрдИ рдирдП рдЕрддрд┐рд░рд┐рдХреНрдд рд╣реИрдВ, рдпрд╣ рд▓реЗрдЦ рдХреЗрд╡рд▓ рд╕рддрд╣реА рд░реВрдк рд╕реЗ рдЙрдирдореЗрдВ рд╕реЗ рдХреБрдЫ рдХреЛ рдХрд╡рд░ рдХрд░рддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рдЗрди рдирдП рдлреАрдЪрд░реНрд╕ рдореЗрдВ рд╕реЗ рдХреБрдЫ рд╕рднреА C ++ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рд▓рд┐рдП рд╕рд╛рдорд╛рдиреНрдп рд╣реЛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рд╕рдВрднрд╡рддрдГ рдХрдИ рд╕рдорд╛рди рд▓реЗрдЦ рд╣реИрдВ, рдЗрд╕рдореЗрдВ рдореИрдВ рдЙрди рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреА рдПрдХ рд╕реВрдЪреА рдмрдирд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реВрдВрдЧрд╛, рдЬрд┐рдиреНрд╣реЗрдВ рд░реЛрдЬрдорд░реНрд░рд╛ рдХреЗ рдЙрдкрдпреЛрдЧ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдХрд╛рд░реНрдпрдХреНрд░рдо рдореЗрдВ рдЖрдЬ:

# 1 - рдСрдЯреЛ


C ++ 11 рд╕реЗ рдкрд╣рд▓реЗ, рдПрдХ рдЪрд░ (рдЬреИрд╕реЗ register, static, extern ) рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП auto рдХреАрд╡рд░реНрдб рдХреЛ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рдерд╛ред C ++ 11 рдореЗрдВ, auto рдЖрдкрдХреЛ рд╡реИрд░рд┐рдПрдмрд▓ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдирд╣реАрдВ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдЬреЛ рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╡реИрд░рд┐рдПрдмрд▓ рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдореВрд▓реНрдп рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд╡рд┐рднрд┐рдиреНрди рд╕реНрдХреЛрдкреЛрдВ тАЛтАЛрдореЗрдВ рдЪрд░ рдШреЛрд╖рд┐рдд рдХрд░рддреЗ рд╕рдордп рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬреИрд╕реЗ рдирд╛рдо рд╕реНрдерд╛рди, рдмреНрд▓реЙрдХ, рдПрдХ рд▓реВрдк рдореЗрдВ рдЖрд░рдВрднреАрдХрд░рдг, рдЖрджрд┐ред
 auto i = 42; // i - int auto l = 42LL; // l - long long auto p = new foo(); // p - foo* 

auto рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдЖрдкрдХреЛ рдХреЛрдб рдХреЛ рдЫреЛрдЯрд╛ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдорд┐рд▓рддреА рд╣реИ (рдЬрдм рддрдХ, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдкреНрд░рдХрд╛рд░ int рдирд╣реАрдВ рд╣реИ, рдЬреЛ рдПрдХ рдЕрдХреНрд╖рд░ рдХрдо рд╣реИ)ред STL рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪреЗрдВ рдХрд┐ рдЖрдкрдХреЛ рдХрдВрдЯреЗрдирд░реЛрдВ рд╕реЗ рдЧреБрдЬрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдореЗрд╢рд╛ рд▓рд┐рдЦрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдпрд╣ рдХреЗрд╡рд▓ рд╕рд╛рджрдЧреА рдХреЗ рд▓рд┐рдП typedef рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЛ рдЕрдкреНрд░рдЪрд▓рд┐рдд рдмрдирд╛рддрд╛ рд╣реИред
 std::map<std::string, std::vector<int>> map; for(auto it = begin(map); it != end(map); ++it) { // do smth } // ,  ++03  ++11 // C++03 for (std::vector<std::map<int, std::string>>::const_iterator it = container.begin(); it != container.end(); ++it) { // do smth } // C++11 for (auto it = container.begin(); it != container.end(); ++it) { // do smth } 

рдпрд╣ рдзреНрдпрд╛рди рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рд╡рд╛рдкрд╕реА рдореВрд▓реНрдп auto рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЖрдк рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд░рд┐рдЯрд░реНрди рдкреНрд░рдХрд╛рд░ рдХреЗ рдмрдЬрд╛рдп auto рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, auto рд╕рдВрдХрд▓рдХ рдХреЛ рдпрд╣ рдирд╣реАрдВ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рдЙрд╕реЗ рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдирд┐рд░реНрдзрд╛рд░рдг рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдпрд╣ рдХреЗрд╡рд▓ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЕрдВрдд рдореЗрдВ рд░рд┐рдЯрд░реНрди рдкреНрд░рдХрд╛рд░ рдХреА рддрд▓рд╛рд╢ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рдПрдХ рдХрдорд╛рдВрдб рджреЗрддрд╛ рд╣реИред рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, compose рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рд░рд┐рдЯрд░реНрди рдкреНрд░рдХрд╛рд░ + рдСрдкрд░реЗрдЯрд░ рдХрд╛ рд░рд┐рдЯрд░реНрди рдкреНрд░рдХрд╛рд░ рд╣реИ, рдЬреЛ рдЯрд╛рдЗрдк T рдФрд░ E рдХреЗ рдореВрд▓реНрдпреЛрдВ рдХреЛ рдмрддрд╛рддрд╛ рд╣реИ E
 template <typename T, typename E> auto compose(T a, E b) -> decltype(a+b) // decltype -        { return a+b; } auto c = compose(2, 3.14); // c - double 


# 2 - nullptr


рдкрд╣рд▓реЗ, рдмрд┐рдВрджреБрдУрдВ рдХреЛ рдЦреАрдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП, NULL рдореИрдХреНрд░реЛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЬреЛ рдХрд┐ рд╢реВрдиреНрдп рд╣реИ - рдПрдХ рдкреВрд░реНрдгрд╛рдВрдХ рдкреНрд░рдХрд╛рд░, рдЬреЛ рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ рд╕рдорд╕реНрдпрд╛рдПрдВ рдкреИрджрд╛ рдХрд░рддрд╛ рдерд╛ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЬрдм рдлрд╝рдВрдХреНрд╢рди рдУрд╡рд░рд▓реЛрдб рдереЗ)ред nullptr рдХрд╛ рдЕрдкрдирд╛ рд╕реНрд╡рдпрдВ рдХрд╛ std::nullptr_t , рдЬреЛ рд╣рдореЗрдВ рдкреВрд░реНрд╡ рдХреА рд╕рдорд╕реНрдпрд╛рдУрдВ рд╕реЗ рдмрдЪрд╛рддрд╛ рд╣реИред nullptr рд╕реЗ рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рдЕрд╢рдХреНрдд рд╕реВрдЪрдХ рдФрд░ bool (рдЬреИрд╕реЗ false ) рдХреЗ рд▓рд┐рдП рдирд┐рд╣рд┐рддрд╛рд░реНрде рд░реВрдкрд╛рдВрддрд░рдг рд╣реИрдВ, рд▓реЗрдХрд┐рди рдкреВрд░реНрдгрд╛рдВрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рд░реВрдкрд╛рдВрддрд░рдг рдирд╣реАрдВ рд╣реИрдВред
 void foo(int* p) {} void bar(std::shared_ptr<int> p) {} int* p1 = NULL; int* p2 = nullptr; if(p1 == p2) {} foo(nullptr); bar(nullptr); bool f = nullptr; int i = nullptr; // :    int   reinterpret_cast 

# 3 - рд░реЗрдВрдЬ-рдЖрдзрд╛рд░рд┐рдд рд▓реВрдк


C ++ 11 рдореЗрдВ, рдПрдХ рд╕реЗрдЯ рдкрд░ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХреЗ рд▓рд┐рдП foreach рдкреНрд░рддрд┐рдорд╛рди рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рдерд╛ред рдирдП рд░реВрдк рдореЗрдВ, рдкреБрдирд░рд╛рд╡реГрддрд┐ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП begin() рдФрд░ end() рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдУрд╡рд░рд▓реЛрдб рдХрд┐рдП рдЬрд╛рдиреЗ рдкрд░ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ рдХрд╛ рдкреНрд░рджрд░реНрд╢рди рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдпрд╣ рддрдм рдЙрдкрдпреЛрдЧреА рд╣реЛрддрд╛ рд╣реИ рдЬрдм рдЖрдк рдХреЗрд╡рд▓ рдПрдХ рд╕рд░рдгреА / рдХрдВрдЯреЗрдирд░ рдХреЗ рддрддреНрд╡реЛрдВ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдпрд╛ рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛, рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ, рдпрд╛ рддрддреНрд╡реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪрд┐рдВрддрд╛ рдХрд┐рдП рдмрд┐рдирд╛ рдЙрдирдХреЗ рд╕рд╛рде рдХреБрдЫ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред
 std::map<std::string, std::vector<int>> map; std::vector<int> v; v.push_back(1); v.push_back(2); v.push_back(3); map["one"] = v; for(const auto &kvp: map) { std::cout << kvp.first << std::endl; for(auto v: kvp.second) std::cout << v << std::endl; } int arr[] = {1,2,3,4,5}; for(int &e: arr) e *= e; 

# 4 - рдУрд╡рд░рд░рд╛рдЗрдб рдФрд░ рдлрд╛рдЗрдирд▓


рдореБрдЭреЗ C ++ рдореЗрдВ рд╣рдореЗрд╢рд╛ рд╡рд░реНрдЪреБрдЕрд▓ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдкрд╕рдВрдж рдирд╣реАрдВ рдЖрдИрдВред virtual рд╡реИрдХрд▓реНрдкрд┐рдХ рд╣реИ рдФрд░ рдЗрд╕рд▓рд┐рдП рдХреЛрдб рдХреЛ рдкрдврд╝рдирд╛ рдереЛрдбрд╝рд╛ рдХрдард┐рди рд╣реЛ рдЧрдпрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдХрд╛рд░рдг рдпрд╣ рд╣рдореЗрд╢рд╛ рд╡рд┐рд░рд╛рд╕рдд рдХреА рдкрджрд╛рдиреБрдХреНрд░рдо рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ рд▓реМрдЯрдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рд╣реЛрддрд╛ рд╣реИ, рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдХреНрдпрд╛ рдХрд┐рд╕реА рд╡рд┐рд╢реЗрд╖ рд╡рд┐рдзрд┐ рдХреЛ рдЖрднрд╛рд╕реА рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдореИрдВрдиреЗ рд╣рдореЗрд╢рд╛ рдЗрд╕ рдХреАрд╡рд░реНрдб рдХреЛ рд╡реНрдпреБрддреНрдкрдиреНрди рдХрдХреНрд╖рд╛рдУрдВ рдореЗрдВ рднреА рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рд╣реИ (рдФрд░ рдРрд╕рд╛ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд▓реЛрдЧреЛрдВ рдХреЛ рдкреНрд░реЛрддреНрд╕рд╛рд╣рд┐рдд рдХрд┐рдпрд╛ рд╣реИ) рдХреЛрдб рдХреЛ рд╕рдордЭрдиреЗ рдореЗрдВ рдЖрд╕рд╛рди рдмрдирд╛рддреЗ рд╣реИрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдРрд╕реА рддреНрд░реБрдЯрд┐рдпрд╛рдВ рд╣реИрдВ рдЬреЛ рдЕрднреА рднреА рд╣реЛ рд╕рдХрддреА рд╣реИрдВред рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЙрджрд╛рд╣рд░рдг рд▓реЗрдВ:
 class B { public: virtual void f(short) {std::cout << "B::f" << std::endl;} }; class D : public B { public: virtual void f(int) {std::cout << "D::f" << std::endl;} }; 

D::f рдУрд╡рд░рд░рд╛рдЗрдбреНрд╕ B::f ред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЙрдирдХреЗ рдкрд╛рд╕ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рд╣реИрдВ, рдПрдХ рд╡рд┐рдзрд┐ short рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ, рджреВрд╕рд░рд╛ int рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП B::f рдПрдХ рд╣реА рдирд╛рдо рдХреЗ рд╕рд╛рде рдПрдХ рдФрд░ рд╡рд┐рдзрд┐ рд╣реИ, рдЕрддрд┐рднрд╛рд░рд┐рдд, рдФрд░ рдЕрддрд┐рд░рдВрдЬрд┐рдд рдирд╣реАрдВред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдмреЗрд╕ рдХреНрд▓рд╛рд╕ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреЙрдЗрдВрдЯрд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд╛рдо рдХрд░рддреЗ рд╣реБрдП, рдЖрдк f() рдХреЙрд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ "рдУрд╡рд░рд░рд╛рдЗрдб" рд╡рд┐рдзрд┐ рдХреЗ рдЖрдЙрдЯрдкреБрдЯ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: "D :: f", рд▓реЗрдХрд┐рди рдЖрдЙрдЯрдкреБрдЯ "B :: f" рд╣реЛрдЧрд╛ред

рдпрд╣рд╛рдВ рдПрдХ рдФрд░ рд╕рдВрднрд╛рд╡рд┐рдд рддреНрд░реБрдЯрд┐ рд╣реИ: рдкреИрд░рд╛рдореАрдЯрд░ рд╕рдорд╛рди рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЖрдзрд╛рд░ рд╡рд░реНрдЧ рдореЗрдВ рд╡рд┐рдзрд┐ рд╕реНрдерд┐рд░ рд╣реИ, рд▓реЗрдХрд┐рди рд╡реНрдпреБрддреНрдкрдиреНрди рдПрдХ рдореЗрдВ рдпрд╣ рдирд╣реАрдВ рд╣реИред
 class B { public: virtual void f(int) const {std::cout << "B::f " << std::endl;} }; class D : public B { public: virtual void f(int) {std::cout << "D::f" << std::endl;} }; 

рдлрд┐рд░, рдпреЗ рдУрд╡рд░рд░рд╛рдЗрдб рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреЗ рдмрдЬрд╛рдп рджреЛ рдЕрддрд┐рднрд╛рд░рд┐рдд рд╣реИрдВред
рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, рдЕрдм рдЗрди рддреНрд░реБрдЯрд┐рдпреЛрдВ рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рд╣реИред рджреЛ рдирдП рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ (рдХреАрд╡рд░реНрдб рдирд╣реАрдВ) рдЬреЛрдбрд╝реЗ рдЧрдП рдереЗ: override , рдпрд╣ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рд╡рд┐рдзрд┐ рдмреЗрд╕ рдХреНрд▓рд╛рд╕ рдореЗрдВ рд╡рд░реНрдЪреБрдЕрд▓ рд╡рд┐рдзрд┐ рдХрд╛ рдПрдХ рдУрд╡рд░рд░рд╛рдЗрдб рд╣реИ, рдФрд░ final , рдпрд╣ рджрд░реНрд╢рд╛рддрд╛ рд╣реИ рдХрд┐ рд╡реНрдпреБрддреНрдкрдиреНрди рд╡рд░реНрдЧ рдХреЛ рд╡рд░реНрдЪреБрдЕрд▓ рд╡рд┐рдзрд┐ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдкрд╣рд▓рд╛ рдЙрджрд╛рд╣рд░рдг рдЕрдм рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:
 class B { public: virtual void f(short) {std::cout << "B::f" << std::endl;} }; class D : public B { public: virtual void f(int) override {std::cout << "D::f" << std::endl;} }; 

рдЕрдм рдпрд╣ рдПрдХ рд╕рдВрдХрд▓рди рддреНрд░реБрдЯрд┐ рдХреЛ рдлреЗрдВрдХ рджреЗрдЧрд╛ (рдареАрдХ рдЙрд╕реА рддрд░рд╣ рдпрджрд┐ рдЖрдк рджреВрд╕рд░реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ override рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ):
 'D::f': method with override specifier 'override' did not override any base class methods 

рджреВрд╕рд░реА рдУрд░, рдпрджрд┐ рдЖрдк рдПрдХ рдРрд╕реА рд╡рд┐рдзрд┐ рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдЬрд┐рд╕рдХрд╛ рдЙрджреНрджреЗрд╢реНрдп рдУрд╡рд░рд░рд╛рдЗрдб (рдкрджрд╛рдиреБрдХреНрд░рдо рдХреЗ рдиреАрдЪреЗ) рди рд╣реЛ, рддреЛ рдЗрд╕реЗ final рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдПрдХ рд╡реНрдпреБрддреНрдкрдиреНрди рд╡рд░реНрдЧ рдореЗрдВ, рдЖрдк рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рджреЛрдиреЛрдВ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
 class B { public: virtual void f(int) {std::cout << "B::f" << std::endl;} }; class D : public B { public: virtual void f(int) override final {std::cout << "D::f" << std::endl;} }; class F : public D { public: virtual void f(int) override {std::cout << "F::f" << std::endl;} }; 

final рд░реВрдк рдореЗрдВ рдШреЛрд╖рд┐рдд рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдлрд╝рдВрдХреНрд╢рди F::f() рджреНрд╡рд╛рд░рд╛ рдУрд╡рд░рд░рд╛рдЗрдб рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ - рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ рдХреНрд▓рд╛рд╕ D рд▓рд┐рдП рдмреЗрд╕ рдХреНрд▓рд╛рд╕ ( ) рдХреА рд╡рд┐рдзрд┐ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рддрд╛ рд╣реИ D

# 5 - рджреГрдврд╝рддрд╛ рд╕реЗ рдЯрд╛рдЗрдк рдХрд┐рдпрд╛ рд╣реБрдЖ рдПрдирдо


C ++ рдореЗрдВ "рдкрд╛рд░рдВрдкрд░рд┐рдХ" рдЧрдгрдирд╛ рдореЗрдВ рдХреБрдЫ рдХрдорд┐рдпрд╛рдВ рд╣реИрдВ: рд╡реЗ рдЕрдкрдиреЗ рдореВрд▓реНрдпреЛрдВ рдХреЛ рдЖрд╕-рдкрд╛рд╕ рдХреЗ рджрд╛рдпрд░реЗ рдореЗрдВ рдирд┐рд░реНрдпрд╛рдд рдХрд░рддреЗ рд╣реИрдВ (рдЬрд┐рд╕рд╕реЗ рдирд╛рдо рд╕рдВрдШрд░реНрд╖ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ), рд╡реЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд░реВрдкрд╛рдВрддрд░рд┐рдд рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВ рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛-рдкрд░рд┐рднрд╛рд╖рд┐рдд рдкреНрд░рдХрд╛рд░ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреЗред

C ++ 11 рдореЗрдВ рдЗрди рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рдПрдХ рдирдИ рд╢реНрд░реЗрдгреА рдХреЗ рдПрдиреНрдпреВрдорд░реЗрд╢рди рдХреА рд╢реБрд░реВрдЖрдд рдХреЗ рд╕рд╛рде рддрдп рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдЬрд┐рд╕реЗ рджреГрдврд╝рддрд╛ рд╕реЗ рдЯрд╛рдЗрдк рдХрд┐рдП рдЧрдП рдПрдирдо рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдЙрдиреНрд╣реЗрдВ enum class keyword рджреНрд╡рд╛рд░рд╛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рд╡реЗ рдЕрдм рдЕрдкрдиреЗ рдЖрд╕-рдкрд╛рд╕ рдХреЗ рдорд╛рдиреЛрдВ рдХреЛ рдЖрд╕-рдкрд╛рд╕ рдХреЗ рджрд╛рдпрд░реЗ рдореЗрдВ рдирд┐рд░реНрдпрд╛рдд рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рдЙрдиреНрд╣реЗрдВ рдЕрдм рдкреВрд░реНрдг рд░реВрдк рд╕реЗ рдкреВрд░реНрдгрд╛рдВрдХ рдкреНрд░рдХрд╛рд░ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛-рдкрд░рд┐рднрд╛рд╖рд┐рдд рдкреНрд░рдХрд╛рд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ (рдпрд╣ рд╡рд┐рдХрд▓реНрдк "рдкрд╛рд░рдВрдкрд░рд┐рдХ" рдЧрдгрдирд╛ "рдХреЗ рд▓рд┐рдП рднреА рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ)ред
 enum class Options {None, One, All}; Options o = Options::All; 


# 6 - рд╕реНрдорд╛рд░реНрдЯ рдкреЙрдЗрдВрдЯрд░реНрд╕


рд╣рдм рдкрд░ рдФрд░ рдЗрд╕ рд╡рд┐рд╖рдп рдкрд░ рд▓рд┐рдЦреЗ рдЧрдП рдЕрдиреНрдп рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдкрд░, рдХрдИ рд▓реЗрдЦ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдХреЗрд╡рд▓ рд╕рдВрджрд░реНрдн рдЧрд┐рдирддреА рдФрд░ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдореЗрдореЛрд░реА рдбреАрд▓рдХреНрд▓реЗрд╢рди рдХреЗ рд╕рд╛рде рд╕реНрдорд╛рд░реНрдЯ рдкреЙрдЗрдВрдЯрд░реНрд╕ рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ:
  1. unique_ptr : рдХрд╛ рдЙрдкрдпреЛрдЧ рддрдм рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬрдм рдореЗрдореЛрд░реА рд░рд┐рд╕реЛрд░реНрд╕ рдХреЛ рд╕рд╛рдЭрд╛ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП (рдЗрд╕рдореЗрдВ рдХреЙрдкреА рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдирд╣реАрдВ рд╣реИ), рд▓реЗрдХрд┐рди рдЗрд╕реЗ рдХрд┐рд╕реА рдЕрдиреНрдп unique_ptr рдХреЛ рдкрд╛рд╕ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ
  2. share_ptr : рдХрд╛ рдЙрдкрдпреЛрдЧ рддрдм рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬрдм рдореЗрдореЛрд░реА рд╕рдВрд╕рд╛рдзрди рд╕рд╛рдЭрд╛ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП
  3. weak_ptr : shared_ptr рдХрд┐рдП рдЧрдП рдСрдмреНрдЬреЗрдХреНрдЯ рджреНрд╡рд╛рд░рд╛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдВрджрд░реНрдн рд╣реЛрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд▓рд┐рдВрдХ рдХреА рдЧрд┐рдирддреА рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ; рдЖрдкрдХреЛ рдЪрдХреНрд░реАрдп рдирд┐рд░реНрднрд░рддрд╛ рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ

рдирд┐рдореНрди рдЙрджрд╛рд╣рд░рдг unique_ptr рдкреНрд░рджрд░реНрд╢рд┐рдд unique_ptr ред рдХрд┐рд╕реА рдЕрдиреНрдп unique_ptr рд▓рд┐рдП рдХрд┐рд╕реА рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рд╕реНрд╡рд╛рдорд┐рддреНрд╡ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, std :: unique_ptr (рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдЕрдВрддрд┐рдо рдкреИрд░рд╛рдЧреНрд░рд╛рдл рдореЗрдВ рдЪрд░реНрдЪрд╛ рдХреА рдЬрд╛рдПрдЧреА) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред рд╕реНрд╡рд╛рдорд┐рддреНрд╡ рд╣рд╕реНрддрд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рд╣рд╕реНрддрд╛рдВрддрд░рд┐рдд рд╕реНрд╡рд╛рдорд┐рддреНрд╡ рд╡рд╛рд▓рд╛ рд╕реНрдорд╛рд░реНрдЯ рд╕реВрдЪрдХ рд╢реВрдиреНрдп рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ get() рд╡рд╛рдкрд╕ nullptr рд╣реЛ рдЬрд╛рдПрдЧрд╛ред
 void foo(int* p) { std::cout << *p << std::endl; } std::unique_ptr<int> p1(new int(42)); std::unique_ptr<int> p2 = std::move(p1); // transfer ownership if(p1) foo(p1.get()); (*p2)++; if(p2) foo(p2.get()); 

рджреВрд╕рд░рд╛ рдЙрджрд╛рд╣рд░рдг shared_ptr рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИред рдЙрдкрдпреЛрдЧ рд╕рдорд╛рди рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╢рдмреНрджрд╛рд░реНрде рдЕрд▓рдЧ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рд╕реНрд╡рд╛рдорд┐рддреНрд╡ рдЕрдм рд╕рд╛рдЭрд╛ рд╣реИред
 void foo(int* p) { } void bar(std::shared_ptr<int> p) { ++(*p); } std::shared_ptr<int> p1(new int(42)); std::shared_ptr<int> p2 = p1; bar(p1); foo(p2.get()); 

рдкрд╣рд▓реА рдШреЛрд╖рдгрд╛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИ:
 auto p3 = std::make_shared<int>(42); 

make_sared рдПрдХ рдРрд╕рд╛ рдлрд╝рдВрдХреНрд╢рди рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдПрдХ рд╕рд╛рдЭрд╛ рдЖрд╡рдВрдЯрди рдХреЗ рд╕рд╛рде рдПрдХ рд╕рд╛рдЭрд╛ рдСрдмреНрдЬреЗрдХреНрдЯ рдФрд░ рд╕реНрдорд╛рд░реНрдЯ рдкреЙрдЗрдВрдЯрд░ рдХреЗ рд▓рд┐рдП рдореЗрдореЛрд░реА рдЖрд╡рдВрдЯрд┐рдд рдХрд░рдиреЗ рдХрд╛ рд▓рд╛рдн рд╣реЛрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдПрдХ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ shared_ptr рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХрд╛ рд╡рд┐рд░реЛрдз рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрд╣рд╛рдВ рдХрдо рд╕реЗ рдХрдо рджреЛ рдЖрд╡рдВрдЯрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдпрд╣ рдПрдХ рд╕реНрдореГрддрд┐ рд░рд┐рд╕рд╛рд╡ рдХрд╛ рдХрд╛рд░рдг рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдмрд╕ рдпрд╣ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдпрджрд┐ рдПрдХ рдЕрдкрд╡рд╛рдж рдлреЗрдВрдХрддрд╛ рд╣реИ рддреЛ рд░рд┐рд╕рд╛рд╡ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
 void foo(std::shared_ptr<int> p, int init) { *p = init; } foo(std::shared_ptr<int>(new int(42)), seed()); 

рдпрд╣ рд╕рдорд╕реНрдпрд╛ make_shared рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╣рд▓ рдХреА make_shared ред
рдФрд░ рдЕрдВрдд рдореЗрдВ, weak_ptr рд╕рд╛рде рдПрдХ рдЙрджрд╛рд╣рд░рдгред рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдЖрдкрдХреЛ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдПрдХреНрд╕реЗрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП lock() рдХреЙрд▓ рдХрд░рдХреЗ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП shared_ptr рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред
 auto p = std::make_shared<int>(42); std::weak_ptr<int> wp = p; { auto sp = wp.lock(); std::cout << *sp << std::endl; } p.reset(); if(wp.expired()) std::cout << "expired" << std::endl; 

# 7 - рд▓рдВрдмреЛрджрд░


рдирдП рдорд╛рдирдХ рдиреЗ рдЖрдЦрд┐рд░рдХрд╛рд░ рд▓рдВрдмреЛрджрд░ рднрд╛рд╡реЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдЬреЛрдбрд╝рд╛ рд╣реИред рд╣рдо рдЬрд╣рд╛рдВ рднреА рдПрдХ рдлрдирдХрд╛рд░ рдпрд╛ std::function рдХреА рдЙрдореНрдореАрдж рд╣реИ, рд╣рдо рд▓рдВрдмреЛрджрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдПрдХ рд▓рдВрдмреЛрджрд░, рдЖрдо рддреМрд░ рдкрд░ рдмреЛрд▓ рд░рд╣рд╛ рд╣реИ, рдПрдХ рдлрд╝рдирдХрд╛рд░ рдХрд╛ рдПрдХ рдЫреЛрдЯрд╛ рдЕрдВрдХрди рд╣реИ, рдПрдХ рдЧреБрдордирд╛рдо рдлрд╝рдирдХрд╛рд░ рдЬреИрд╕рд╛ рдХреБрдЫ рд╣реИред рдЕрдзрд┐рдХ рд╡рд┐рд╡рд░рдг рдкрдврд╝реЗ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, MSDN рдкрд░ред
 std::vector<int> v; v.push_back(1); v.push_back(2); v.push_back(3); std::for_each(std::begin(v), std::end(v), [](int n) {std::cout << n << std::endl;}); auto is_odd = [](int n) {return n%2==1;}; auto pos = std::find_if(std::begin(v), std::end(v), is_odd); if(pos != std::end(v)) std::cout << *pos << std::endl; 

рдЕрдм рдереЛрдбрд╝рд╛ рдореБрд╢реНрдХрд┐рд▓ - рдкреБрдирд░рд╛рд╡рд░реНрддреА рд▓рдВрдмреЛрджрд░ред рдлрд╛рдЗрдмреЛрдиреИрдЪрд┐ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдПрдХ рдореЗрдордиреЗ рдХреА рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВред рдпрджрд┐ рдЖрдк auto рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕реЗ рд▓рд┐рдЦрдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдПрдХ рд╕рдВрдХрд▓рди рддреНрд░реБрдЯрд┐ рдорд┐рд▓реЗрдЧреА:
 auto fib = [&fib](int n) {return n < 2 ? 1 : fib(n-1) + fib(n-2);}; 

 error C3533: 'auto &': a parameter cannot have a type that contains 'auto' error C3531: 'fib': a symbol whose type contains 'auto' must have an initializer error C3536: 'fib': cannot be used before it is initialized error C2064: term does not evaluate to a function taking 1 arguments 

рдЪрдХреНрд░реАрдп рдирд┐рд░реНрднрд░рддрд╛ рд╣реИред рдЗрд╕рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ std::function рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред
 std::function<int(int)> lfib = [&lfib](int n) {return n < 2 ? 1 : lfib(n-1) + lfib(n-2);}; 

# 8 - рдЧреИрд░-рд╕рджрд╕реНрдп рд╢реБрд░реВ () рдФрд░ рдЕрдВрдд ()


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

рдЪрд▓реЛ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдкрд┐рдЫрд▓реЗ рдЙрджрд╛рд╣рд░рдг рдЬрд╣рд╛рдВ рдореИрдВ рдПрдХ рд╡реЗрдХреНрдЯрд░ рдХрд╛ рдЙрддреНрдкрд╛рджрди рдХрд░рддрд╛ рд╣реВрдВ рдФрд░ рдлрд┐рд░ рдкрд╣рд▓реЗ рд╡рд┐рд╖рдо рддрддреНрд╡ рдХреА рддрд▓рд╛рд╢ рдХрд░рддрд╛ рд╣реВрдВред рдпрджрд┐ рд╣рдо std::vector рдХреЛ C-like рд╕рд░рдгреА рд╕реЗ рдмрджрд▓рддреЗ рд╣реИрдВ, рддреЛ рдХреЛрдб рдЗрд╕ рддрд░рд╣ рджрд┐рдЦреЗрдЧрд╛:
 int arr[] = {1,2,3}; std::for_each(&arr[0], &arr[0]+sizeof(arr)/sizeof(arr[0]), [](int n) {std::cout << n << std::endl;}); auto is_odd = [](int n) {return n%2==1;}; auto begin = &arr[0]; auto end = &arr[0]+sizeof(arr)/sizeof(arr[0]); auto pos = std::find_if(begin, end, is_odd); if(pos != end) std::cout << *pos << std::endl; 

begin() рдФрд░ end() рдЗрд╕реЗ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
 int arr[] = {1,2,3}; std::for_each(std::begin(arr), std::end(arr), [](int n) {std::cout << n << std::endl;}); auto is_odd = [](int n) {return n%2==1;}; auto pos = std::find_if(std::begin(arr), std::end(arr), is_odd); if(pos != std::end(arr)) std::cout << *pos << std::endl; 

рдпрд╣ std::vector рдХреЗ рд╕рд╛рде рдХреЛрдб рдХреЗ рд▓рд┐рдП рд▓рдЧрднрдЧ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рдорд╛рди рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╣рдо рд╕рднреА рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рд╡рд┐рдзрд┐ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ begin() рдФрд░ end() рджреНрд╡рд╛рд░рд╛ рд╕рдорд░реНрдерд┐рдд рд╣реИрдВред
 template <typename Iterator> void bar(Iterator begin, Iterator end) { std::for_each(begin, end, [](int n) {std::cout << n << std::endl;}); auto is_odd = [](int n) {return n%2==1;}; auto pos = std::find_if(begin, end, is_odd); if(pos != end) std::cout << *pos << std::endl; } template <typename C> void foo(C c) { bar(std::begin(c), std::end(c)); } template <typename T, size_t N> void foo(T(&arr)[N]) { bar(std::begin(arr), std::end(arr)); } int arr[] = {1,2,3}; foo(arr); std::vector<int> v; v.push_back(1); v.push_back(2); v.push_back(3); foo(v); 

# 9 - static_assert рдФрд░ рд╕рдВрдкрддреНрддрд┐ рд╡рд░реНрдЧ


static_assert рд╕рдВрдХрд▓рди рд╕рдордп рдкрд░ рдХрдерди рдХреА рдЬрд╛рдБрдЪ рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ рдХрдерди рд╕рддреНрдп рд╣реИ, рддреЛ рдХреБрдЫ рднреА рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред рдпрджрд┐ рдпрд╣ рдЧрд▓рдд рд╣реИ, рддреЛ рд╕рдВрдХрд▓рдХ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИред
 template <typename T, size_t Size> class Vector { static_assert(Size > 3, "Size is too small"); T _points[Size]; }; int main() { Vector<int, 16> a1; Vector<double, 2> a2; return 0; } 

 error C2338: Size is too small see reference to class template instantiation 'Vector<T,Size>' being compiled with [ T=double, Size=2 ] 

рд╕рдВрдкрддреНрддрд┐ рд╡рд░реНрдЧреЛрдВ рдХреЗ рд╕рд╛рде рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рдкрд░ static_assert рдЕрдзрд┐рдХ рдЙрдкрдпреЛрдЧреА рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рдХрдХреНрд╖рд╛рдУрдВ рдХрд╛ рдПрдХ рд╕рдВрдЧреНрд░рд╣ рд╣реИ рдЬреЛ рд╕рдВрдХрд▓рди рд╕рдордп рдкрд░ рдкреНрд░рдХрд╛рд░ рдХреА рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рд╡реЗ <type_traits> рд╣реИрдбрд░ рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╣реИрдВред рдЗрд╕ рд╣реЗрдбрд░ рдореЗрдВ рдХрдИ рддрд░рд╣ рдХреА рдХрдХреНрд╖рд╛рдПрдВ рд╣реИрдВ: рд╣реЗрд▓реНрдкрд░ рдХреНрд▓рд╛рд╕, рдЯреНрд░рд╛рдВрд╕рдлреЙрд░реНрдореЗрд╢рди рдХреНрд▓рд╛рд╕ рдФрд░ рдкреНрд░реЙрдкрд░реНрдЯреА рдХреНрд▓рд╛рд╕реЗрдЬред
рдирд┐рдореНрди рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, add рдлрд╝рдВрдХреНрд╢рди рдХреЗрд╡рд▓ рдкреВрд░реНрдгрд╛рдВрдХ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рд╣реИред
 template <typename T1, typename T2> auto add(T1 t1, T2 t2) -> decltype(t1 + t2) { return t1 + t2; } 

рд╣рд╛рд▓рд╛рдБрдХрд┐, рдпрджрд┐ рдЖрдк рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд▓рд┐рдЦрддреЗ рд╣реИрдВ рддреЛ рдХреЛрдИ рд╕рдВрдХрд▓рди рддреНрд░реБрдЯрд┐ рдирд╣реАрдВ рд╣реЛрдЧреА:
 std::cout << add(1, 3.14) << std::endl; std::cout << add("one", 2) << std::endl; 

рдХрд╛рд░реНрдпрдХреНрд░рдо рдмрд╕ "4.14" рдФрд░ "рдИ" рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИред static_assert рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ static_assert , рдЗрди рджреЛ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЛ рд╕рдВрдХрд▓рди рд╕рдордп рдкрд░ static_assert рддреНрд░реБрдЯрд┐ static_assert рджреЗрдЧрд╛ред
 template <typename T1, typename T2> auto add(T1 t1, T2 t2) -> decltype(t1 + t2) { static_assert(std::is_integral<T1>::value, "Type T1 must be integral"); static_assert(std::is_integral<T2>::value, "Type T2 must be integral"); return t1 + t2; } 

 error C2338: Type T2 must be integral see reference to function template instantiation 'T2 add<int,double>(T1,T2)' being compiled with [ T2=double, T1=int ] error C2338: Type T1 must be integral see reference to function template instantiation 'T1 add<const char*,int>(T1,T2)' being compiled with [ T1=const char *, T2=int ] 

# 10 - рдЖрдВрджреЛрд▓рди рдХреЗ рд╢рдмреНрджрд╛рд░реНрде


рдпрд╣ C ++ 11 рдореЗрдВ рдЙрдард╛рдпрд╛ рдЧрдпрд╛ рдПрдХ рдФрд░ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╡рд┐рд╖рдп рд╣реИред рдЗрд╕ рд╡рд┐рд╖рдп рдкрд░, рдЖрдк рдкреИрд░рд╛рдЧреНрд░рд╛рдл рдирд╣реАрдВ, рдмрд▓реНрдХрд┐ рдХрдИ рд▓реЗрдЦ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдмрд╣реБрдд рдЧрд╣рд░рд╛рдИ рддрдХ рдирд╣реАрдВ рдЧрдпрд╛ред

C ++ 11 рдиреЗ рд░реЗрд╡рд▓реНрдпреВ рд░реЗрдлрд░реЗрдВрд╕ (&& рдХреЗ рд╕рд╛рде рдирд┐рд░реНрджрд┐рд╖реНрдЯ) рдХреА рдЕрд╡рдзрд╛рд░рдгрд╛ рдХреЛ рд▓реИрд╡рд▓реНрдпреВ (рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдЬрд┐рд╕рдХрд╛ рдПрдХ рдирд╛рдо рд╣реИ) рдФрд░ рд░рд┐рд╡реЗрд▓реНрдпреВ (рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдЬрд┐рд╕рдХрд╛ рдХреЛрдИ рдирд╛рдо рдирд╣реАрдВ рд╣реИ) рдХреЗ рдмреАрдЪ рдЕрдВрддрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреЗрд╢ рдХрд┐рдпрд╛ред рд░рд┐рд▓реЛрдХреЗрд╢рди рдХреЗ рд╢рдмреНрджрд╛рд░реНрдереЛрдВ рдореЗрдВ рдмрджрд▓рд╛рд╡реЛрдВ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ (рдкрд╣рд▓реЗ рдЙрдиреНрд╣реЗрдВ рдЕрдкрд░рд┐рд╡рд░реНрддрд┐рдд рдорд╛рдирд╛ рдЬрд╛рддрд╛ рдерд╛ рдФрд░ рдХреЙрдиреНрд╕реНрдЯ рдЯреА рдПрдВрдб рдЯрд╛рдЗрдкреНрд╕ рд╕реЗ рдЕрд▓рдЧ рдирд╣реАрдВ рдерд╛)ред

рдХрдХреНрд╖рд╛ / рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рдХреБрдЫ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд╕рджрд╕реНрдп рдХрд╛рд░реНрдп рд╣реЛрддреЗ рдереЗ: рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдирд┐рд░реНрдорд╛рддрд╛ (рдпрджрд┐ рдХреЛрдИ рдЕрдиреНрдп рдирд┐рд░реНрдорд╛рддрд╛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдирд╣реАрдВ рд╣реИ), рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдирд┐рд░реНрдорд╛рддрд╛ рдФрд░ рд╡рд┐рдзреНрд╡рдВрд╕рдХред рдХреЙрдкреА рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдЪрд░ рдХреА рдмрд┐рдЯрд╡рд╛рдЗрдЬрд╝ рдХреЙрдкреА рдХрд░рддрд╛ рд╣реИред рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐ рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдХреБрдЫ рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд╕рдВрдХреЗрдд рдХреЗ рд╕рд╛рде рдПрдХ рд╡рд░реНрдЧ рд╣реИ, рддреЛ рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдирд┐рд░реНрдорд╛рддрд╛ рдмрд┐рдВрджреБрдУрдВ рдХреА рдирдХрд▓ рдХрд░реЗрдЧрд╛, рди рдХрд┐ рдЙрди рд╡рд╕реНрддреБрдУрдВ рдХреА рдЬреЛ рд╡реЗ рдЗрдВрдЧрд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдпрджрд┐ рдЖрдк рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдореЗрдВ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдареАрдХ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдФрд░ рди рдХреЗрд╡рд▓ рдЙрдиреНрд╣реЗрдВ рдЗрдВрдЧрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдирд┐рд░реНрдорд╛рддрд╛ рдореЗрдВ рдЗрд╕рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред

рдПрдХ рдЪрд╛рд▓ рдирд┐рд░реНрдорд╛рдгрдХрд░реНрддрд╛ рдФрд░ рдПрдХ рдЪрд╛рд▓ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдСрдкрд░реЗрдЯрд░ - рдпреЗ рджреЛ рд╡рд┐рд╢реЗрд╖ рдХрд╛рд░реНрдп рдкреИрд░рд╛рдореАрдЯрд░ T && рд▓реЗрддреЗ рд╣реИрдВ, рдЬреЛ рдПрдХ рдкреНрд░рддрд┐рджреНрд╡рдВрджреНрд╡рд┐рддрд╛ рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╡реЗ рд╡рд╕реНрддреБ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдирд┐рдореНрди рдЙрджрд╛рд╣рд░рдг рдПрдХ рдбрдореА рдмрдлрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рджрд┐рдЦрд╛рддрд╛ рд╣реИред рдмрдлрд░ рдХреЛ рдПрдХ рдирд╛рдо рд╕реЗ рдкрд╣рдЪрд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ T рдХреЗ рддрддреНрд╡реЛрдВ рдХреА рдПрдХ рд╕рд░рдгреА рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реВрдЪрдХ ( std::unique_ptr рдореЗрдВ рд▓рд┐рдкрдЯреЗ std::unique_ptr ) рдФрд░ рдПрдХ рдЪрд░ рд╣реЛрддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╕рд░рдгреА рдХрд╛ рдЖрдХрд╛рд░ рд╣реЛрддрд╛ рд╣реИред
 template <typename T> class Buffer { std::string _name; size_t _size; std::unique_ptr<T[]> _buffer; public: // default constructor Buffer(): _size(16), _buffer(new T[16]) {} // constructor Buffer(const std::string& name, size_t size): _name(name), _size(size), _buffer(new T[size]) {} // copy constructor Buffer(const Buffer& copy): _name(copy._name), _size(copy._size), _buffer(new T[copy._size]) { T* source = copy._buffer.get(); T* dest = _buffer.get(); std::copy(source, source + copy._size, dest); } // copy assignment operator Buffer& operator=(const Buffer& copy) { if(this != &copy) { _name = copy._name; if(_size != copy._size) { _buffer = nullptr; _size = copy._size; _buffer = (_size > 0)? new T[_size] : nullptr; } T* source = copy._buffer.get(); T* dest = _buffer.get(); std::copy(source, source + copy._size, dest); } return *this; } // move constructor Buffer(Buffer&& temp): _name(std::move(temp._name)), _size(temp._size), _buffer(std::move(temp._buffer)) { temp._buffer = nullptr; temp._size = 0; } // move assignment operator Buffer& operator=(Buffer&& temp) { assert(this != &temp); // assert if this is not a temporary _buffer = nullptr; _size = temp._size; _buffer = std::move(temp._buffer); _name = std::move(temp._name); temp._buffer = nullptr; temp._size = 0; return *this; } }; template <typename T> Buffer<T> getBuffer(const std::string& name) { Buffer<T> b(name, 128); return b; } int main() { Buffer<int> b1; Buffer<int> b2("buf2", 64); Buffer<int> b3 = b2; Buffer<int> b4 = getBuffer<int>("buf4"); b1 = getBuffer<int>("buf5"); return 0; } 

рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХреЙрдкреА рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдФрд░ рдХреЙрдкреА рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдСрдкрд░реЗрдЯрд░ рдЖрдкрдХреЛ рдкрд░рд┐рдЪрд┐рдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред C ++ 11 рдореЗрдВ рдирдпрд╛ рдореВрд╡ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдФрд░ рдореВрд╡ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдСрдкрд░реЗрдЯрд░ рд╣реИред рдпрджрд┐ рдЖрдк рдЗрд╕ рдХреЛрдб рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рдЬрдм b4 рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдореВрд╡ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЛ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЬрдм b1 рдПрдХ рдорд╛рди рд╕реМрдВрдкрд╛ b1 , рддреЛ рдореВрд╡ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдСрдкрд░реЗрдЯрд░ рдХрд╣рд▓рд╛рддрд╛ рд╣реИред рдЗрд╕рдХрд╛ рдХрд╛рд░рдг getBuffer() рдлрд╝рдВрдХреНрд╢рди рджреНрд╡рд╛рд░рд╛ рд▓реМрдЯрд╛рдпрд╛ рдЧрдпрд╛ рдорд╛рди рд╣реИред

рдЖрдкрдиреЗ рд╢рд╛рдпрдж std рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рд╣реИ :: рдЬрдм рдПрдХ рдЪрд░ рдирд╛рдо рдФрд░ рдПрдХ рдмрдлрд╝рд░ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреЙрдЗрдВрдЯрд░ рдХреЛ рдкреНрд░рд╛рд░рдВрдн рдХрд░рддреЗ рд╣реБрдП рдореВрд╡ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдореЗрдВ рд▓реЗ рдЬрд╛рдПрдБ ред рдирд╛рдо рд╣реИ рд╕реНрдЯреНрд░рд┐рдВрдЧ std::string рдФрд░ std::string рднреА рдЖрдВрджреЛрд▓рди рдХреЗ рд╢рдмреНрджрд╛рд░реНрде рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред рд╡рд╣реА unique_ptr рд▓рд┐рдП рдЬрд╛рддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЕрдЧрд░ рд╣рдордиреЗ рдХреЗрд╡рд▓ _name(temp._name) рд▓рд┐рдЦрд╛ рд╣реИ, рддреЛ рдХреЙрдкреА рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЛ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рд▓реЗрдХрд┐рди рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ std::string рд▓рд┐рдП рдореВрд╡ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЛ рдХреНрдпреЛрдВ рдирд╣реАрдВ рдмреБрд▓рд╛рдпрд╛ рдЧрдпрд╛? рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рднрд▓реЗ рд╣реА Buffer рд▓рд┐рдП рдореВрд╡ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЛ рдПрдХ рдкреНрд░рддрд┐рджреНрд╡рдВрджреНрд╡рд┐рддрд╛ рдХреЗ рд╕рд╛рде рдмреБрд▓рд╛рдпрд╛ рдЧрдпрд╛ рдерд╛, рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЗ рдЕрдВрджрд░ рдпрд╣ рдЕрднреА рднреА рдПрдХ рд▓рд╡рд▓реНрдпреВ рдХреЗ рд░реВрдк рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рд╣реИред рдЗрд╕реЗ рдлрд┐рд░ рд╕реЗ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдФрд░ рдЖрдкрдХреЛ std::move рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдХреЗрд╡рд▓ рдЕрдВрддрд░рд╛рд▓ рдХреЗ рд╕рдВрджрд░реНрдн рдХреЛ рдЕрдВрддрд░рд╛рд▓ рдореЗрдВ рдмрджрд▓ рджреЗрддрд╛ рд╣реИред

рдПрдХ рдирд┐рд╖реНрдХрд░реНрд╖ рдХреЗ рдмрдЬрд╛рдп


C ++ 11 рдореЗрдВ рдХрдИ рдЪреАрдЬреЗрдВ рд╣реИрдВ рдЬрд┐рдирдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЖрдкрдХреЛ рдмрд╛рдд рдХрд░рдиреА рдЪрд╛рд╣рд┐рдП рдФрд░ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдП; рдпрд╣ рд▓реЗрдЦ рдХрдИ рд╕рдВрднрд╛рд╡рд┐рдд рд╢реБрд░реБрдЖрддрдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдерд╛ред рдЗрд╕ рд▓реЗрдЦ рдиреЗ рднрд╛рд╖рд╛ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреА рдПрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдФрд░ рдПрдХ рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреА рд╢реБрд░реБрдЖрдд рдХреА рдЬрд┐рд╕реЗ рд╣рд░ C ++ рдбреЗрд╡рд▓рдкрд░ рдХреЛ рдЬрд╛рдирдирд╛ рдЪрд╛рд╣рд┐рдПред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдХрд╣рд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рд╕рднреА рдХреА рдЧрд╣рд░реА рд╕рдордЭ рдХреЗ рд▓рд┐рдП, рдпрд╣ рд▓реЗрдЦ рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЕрддрд┐рд░рд┐рдХреНрдд рд╕рд╛рд╣рд┐рддреНрдп рдХреЗ рдмрд┐рдирд╛ рдРрд╕рд╛ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИред

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


All Articles