рдирдИ C ++ 14 рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХрд╛ рдЕрд╡рд▓реЛрдХрди: рднрд╛рдЧ 1

рдЕрдкреНрд░реИрд▓ рдореЗрдВ, рдмреНрд░рд┐рд╕реНрдЯрд▓ рдореЗрдВ C ++ рд╕рдорд┐рддрд┐ рдХреА рдПрдХ рдмреИрдардХ рд╣реБрдИ, рдЬрд┐рд╕рдореЗрдВ рдирдП C ++ 14 рдорд╛рдирдХ рдореЗрдВ рд╕рдВрд╢реЛрдзрди рдХреЗ рдкрд╣рд▓реЗ рдкреНрд░рд╕реНрддрд╛рд╡реЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ред рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдЪрд░реНрдЪрд╛ рдХрд┐рдП рдЧрдП рд╕рднреА рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЛ рдЗрд╕ рдмреИрдардХ рдореЗрдВ рдЕрдиреБрдореЛрджрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдФрд░ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдирдП рдорд╛рдирдХ (N3690 рджрд┐рдирд╛рдВрдХ 15 рдордИ, 2013) рдХреЗ рдорд╕реМрджреЗ рдХреЗ рдирд╡реАрдирддрдо рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рд╕рдореНрдорд╛рди рдХреА рдЬрдЧрд╣ рд▓реЗ рд░рд╣реЗ рд╣реИрдВред

рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд╕реВрдЪреА:


рднрд╛рд╖рд╛ рдореЗрдВ рд╣реА рдмрджрд▓рд╛рд╡ рдЖрддрд╛ рд╣реИ


рдирд┐рдпрдорд┐рдд рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд░рд┐рдЯрд░реНрди рдкреНрд░рдХрд╛рд░ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдПрдВ


C ++ 11 рд╕реЗ рд╢реБрд░реВ рд╣реЛрдиреЗ рдкрд░, рднрд╛рд╖рд╛ рдореЗрдВ рд▓реИрдореНрдмреНрдбрд╛ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рд╣реЛрддреА рд╣реИ, рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдХреЗрд╡рд▓ рдПрдХ return рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рд╣реИ, рддреЛ рдЖрдк рд░рд┐рдЯрд░реНрди рд╡реИрд▓реНрдпреВ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ - рдХрдВрдкрд╛рдЗрд▓рд░ рдЗрд╕реЗ рд╕реНрд╡рдпрдВ рдЖрдЙрдЯрдкреБрдЯ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдХрдИ рд▓реЛрдЧ рдЖрд╢реНрдЪрд░реНрдпрдЪрдХрд┐рдд рдереЗ рдХрд┐ рдпрд╣ рд╕реБрд╡рд┐рдзрд╛ рд╕рд╛рдорд╛рдиреНрдп рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз рдирд╣реАрдВ рд╣реИред рд╕рдВрдмрдВрдзрд┐рдд рдкреНрд░рд╕реНрддрд╛рд╡ C ++ 11 рдХреА рд░рд┐рд▓реАрдЬрд╝ рд╕реЗ рдкрд╣рд▓реЗ рднреА рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛, рд▓реЗрдХрд┐рди рд╕рдордп рд╕реАрдорд╛ рдХреЗ рдХрд╛рд░рдг рдЗрд╕реЗ рд╕реНрдердЧрд┐рдд рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдФрд░ рдЕрдм, рдХреБрдЫ рд╡рд░реНрд╖реЛрдВ рдХреЗ рдмрд╛рдж, рдЗрд╕реЗ рдорд╛рдирдХ рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рдерд╛ред рд╕рд╛рде рд╣реА, рдЗрд╕ рд╕рдВрд╢реЛрдзрди рдореЗрдВ рдХрд╣рд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рдпрджрд┐ рдХрд┐рд╕реА рдлрд╝рдВрдХреНрд╢рди рдпрд╛ рд▓реИрдореНрдмреНрдбрд╛ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдореЗрдВ рдХрдИ return рд╣реИрдВ рдЬреЛ рдПрдХ рд╣реА рдкреНрд░рдХрд╛рд░ рдХрд╛ рд░рд┐рдЯрд░реНрди рджреЗрддреЗ рд╣реИрдВ, рддреЛ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЛ рднреА рдкреБрдирд░рд╛рд╡рд░реНрддреА рдХреЙрд▓ рдХреЗ рд╕рд╛рде рдХреЗрд╕ рд╕рд╣рд┐рдд рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЯрд╛рдЗрдк рд╡реИрд▓реНрдпреВ рдХреЛ рдЖрдЙрдЯрдкреБрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред
 auto iterate(int len) //   - int { for (int i = 0; i < len; ++i) if (search (i)) return i; return -1; } auto h() { return h(); } // ,      auto sum(int i) { if (i == 1) return i; //   - int else return sum(i-1)+i; //     } template <class T> auto f(T t) { return t; } //       []()->auto& { return f(); } //   

рдЗрд╕ рддрдереНрдп рдХреЗ рдмрд╛рд╡рдЬреВрдж рдХрд┐ рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдореЗрдВ рдХрд╛рдлреА рд╕рдВрднрд╛рд╡рдирд╛рдПрдВ рд╣реИрдВ, рдЗрд╕рдХреА рдХреБрдЫ рд╕реАрдорд╛рдПрдБ рд╣реИрдВ:
рдпрджрд┐ рдЖрдк рдлрд╝рдВрдХреНрд╢рди рдШреЛрд╖рдгрд╛ рдХреЛ рд╣реЗрдбрд░ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд░рдЦрддреЗ рд╣реИрдВ, рдФрд░ рдкрд░рд┐рднрд╛рд╖рд╛ рд╕реНрд░реЛрдд рдХреЛрдб рдХреЗ рд╕рд╛рде рд╕рдВрдЧрдд рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╣реИ, рддреЛ рдЬрдм рд╣реЗрдбрд░ рдлрд╝рд╛рдЗрд▓ рдЕрдиреНрдп рдлрд╝рд╛рдЗрд▓реЛрдВ рд╕реЗ рдЬреБрдбрд╝реА рд╣реЛрддреА рд╣реИ, рддреЛ рдХрдВрдкрд╛рдЗрд▓рд░ рдЯрд╛рдЗрдк рдХрд╛ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реЛрдЧрд╛:
 // foo.h class Foo { public: auto getA() const; }; // foo.cpp #include "foo.h" auto Foo::getA() const { return something; } // main.cpp #include "foo.h" int main() { Foo bar; auto a = bar.getA(); // ,    } 

рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреЗрд╡рд▓ рд╕реНрдерд╛рдиреАрдп рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд╕рд╛рде рдпрд╛ рд╣реЗрдбрд░ рдлрд╝рд╛рдЗрд▓реЛрдВ рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░реЗрдЧрд╛ред рдПрдХ рдирд┐рдпрдо рдХреЗ рд░реВрдк рдореЗрдВ, рдмрд╛рдж рдореЗрдВ, рдЯреЗрдореНрдкрд▓реЗрдЯ рдлрд╝рдВрдХреНрд╢рдВрд╕ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ - рдореБрдЦреНрдп, рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, рдЗрд╕ рдирдП рдЙрддреНрдкрд╛рдж рдХреЗ рд▓рд┐рдП рдЖрд╡реЗрджрдиред
рдорд╛рдирдХ рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдкреНрд░рддрд┐рдмрдВрдзреЛрдВ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ: рд╡рд░реНрдЪреБрдЕрд▓ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреЗ рд╕рд╛рде рдЙрдкрдпреЛрдЧ рдкрд░ рдкреНрд░рддрд┐рдмрдВрдз рдФрд░ рдкреНрд░рдХрд╛рд░ std::initializer_list рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХрд╛ рдирд┐рд╖реЗрдзред

рдХреИрдкреНрдЪрд░-рдмрд╛рдп-рдореВрд╡ рдХреЗ рд╕рдорд░реНрдерди рдХреЗ рд╕рд╛рде рдХреИрдкреНрдЪрд░ рдХрд┐рдП рдЧрдП рд▓реИрдореНрдмреНрдбрд╛ рд╡реЗрд░рд┐рдПрдмрд▓реНрд╕ рдХреА рдЬреЗрдиреЗрд░рд┐рдХ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝реЗрд╢рди


C ++ 11 рдореЗрдВ, рд▓реИрдореНрдмреНрдбрд╛ рдХреИрдкреНрдЪрд░-рдмрд╛рдп-рдореВрд╡ рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рд╕рдВрдХрд▓рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛:
 #include <memory> #include <iostream> #include <utility> template <class T> void run(T&& runnable) { runnable(); }; int main() { std::unique_ptr<int> result(new int{42}); run([result](){std::cout << *result << std::endl;}); } 

рдХрд┐рд╕реА рдлрдВрдХреНрд╢рди рд▓реИрдореНрдмреНрдбрд╛ рдХреЗ рдЕрдВрджрд░ рдХрд┐рд╕реА рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЕрдкреНрд░рдЪрд▓рд┐рдд рдСрдЯреЛ_рдкреНрд░рдЯрд░ рдЬреИрд╕реЗ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреЗ рдЖрд╡рд░рдг рдХреЛ рд▓рд┐рдЦрдирд╛ рдЖрд╡рд╢реНрдпрдХ рдерд╛ред
рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдХреИрдкреНрдЪрд░-рдЯреВ-рдореВрд╡ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рдмрдЬрд╛рдп, рдХреИрдкреНрдЪрд░ рдХрд┐рдП рдЧрдП рдЪрд░ рдХреЗ рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рдЖрд░рдВрдн рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП
 [ x { move(x) }, y = transform(y, z), foo, bar, baz ] { ... } 

рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, x рдХреЛ x рд▓реЗ рдЬрд╛рдХрд░ рд╕реАрдзреЗ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдХреЙрд▓ transform рдХреЗ рдкрд░рд┐рдгрд╛рдо рд╕реЗ y рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдФрд░ рдмрд╛рдХреА рдХреЛ рд╡реИрд▓реНрдпреВ рджреНрд╡рд╛рд░рд╛ рдХреИрдкреНрдЪрд░ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдПрдХ рдФрд░ рдЙрджрд╛рд╣рд░рдг:
 int x = 4; auto y = [&r = x, x = x+1]()->int { r += 2; return x+2; }(); //  ::x  6,   y 7-. 

рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЖрд░рдВрднрд┐рдХ рд░реВрдк рд╕реЗ рдХреИрдкреНрдЪрд░ рдХрд┐рдП рдЧрдП рдЪрд░ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЗрдВрдЧрд┐рдд рдХрд░рдирд╛ рдирд┐рд╖рд┐рджреНрдз рдирд╣реАрдВ рд╣реИ:
 [int x = get_x()] { ... } [Container y{get_container()}] { ... } [int z = 5] { ... } 

рдХрдИ рд▓реЛрдЧ рдЖрд╢реНрдЪрд░реНрдпрдЪрдХрд┐рдд рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╡реЗ рдХреЗрд╡рд▓ рдирд┐рдореНрди рд╡рд┐рдзрд┐ рдХрд╛ рд╕рдорд░реНрдерди рдХреНрдпреЛрдВ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ:
 [&&x] { ... } 

рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рд╣рдо рдкреНрд░рддрд┐рджреНрд╡рдВрджреНрд╡рд┐рддрд╛ рд▓рд┐рдВрдХ рдкрд░ рдХрдмреНрдЬрд╛ рдирд╣реАрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рд╣рдо рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдпрджрд┐ рд╣рдо рдЗрд╕ рддрд░рд╣ рд╕реЗ рдЪрд▓реЗ рдЧрдП, рддреЛ рдЖрдВрджреЛрд▓рди рдмрд╣реБрдд рдмрд╛рдж рдореЗрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЬрдм рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╡рд╕реНрддреБ рдЕрдм рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреА рд╣реИред рдЪрд░ рдХреЛ рдХреИрдкреНрдЪрд░ рдХрд░рддреЗ рд╕рдордп рд╣рдореЗрдВ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдФрд░ рд▓реИрдореНрдмрдбрд╛ рдХреЛ рдХреЙрд▓ рдХрд░рддреЗ рд╕рдордп рдирд╣реАрдВред

рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд (рдмрд╣реБрд░реВрдкреА) рд▓рдВрдмреЛрджрд░ рднрд╛рд╡


C ++ 11 рдореЗрдВ, рд▓реИрдореНрдмреНрдбрд╛ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпрд╛рдБ рдПрдХ рдРрд╕реА рдХрдХреНрд╖рд╛ рдХреА рд╡рд╕реНрддреБрдУрдВ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рддреА рд╣реИрдВ, рдЬрд┐рд╕рдореЗрдВ рдПрдХ рдЧреИрд░-рдорд╛рдирдХ рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдСрдкрд░реЗрдЯрд░ рд╣реЛрддрд╛ рд╣реИред рдпрд╣ рд╕рдВрд╢реЛрдзрди рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдХрд░рддрд╛ рд╣реИ:

рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдПрдХ рд╣реА рдЯреЗрдореНрдкрд▓реЗрдЯ рд▓реИрдореНрдмреНрдбрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рд╡рд┐рднрд┐рдиреНрди рд╕рдВрджрд░реНрднреЛрдВ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
 void f1(int (*)(int)) { } void f2(char (*)(int)) { } void g(int (*)(int)) { } // #1 void g(char (*)(char)) { } // #2 void h(int (*)(int)) { } // #3 void h(char (*)(int)) { } // #4 auto glambda = [](auto a) { return a; }; f1(glambda); // OK f2(glambda); // : ID   g(glambda); // :  h(glambda); // OK:  #3,       ID int& (*fpi)(int*) = [](auto* a) -> auto& { return *a; }; // OK 

рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рд▓рд┐рдВрдХ рдФрд░ рдЯреЗрдореНрдкрд▓реЗрдЯреНрд╕ рдХреЗ рд╕рд╛рде, рддрд░реНрдХ рдХреА рдПрдХ рдЪрд░ рд╕рдВрдЦреНрдпрд╛ (рдЪрд░ рдЯреЗрдореНрдкрд▓реЗрдЯ) рдХреЗ рд╕рд╛рде, рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдордд рднреВрд▓рдирд╛:
 auto vglambda = [](auto printer) { return [=](auto&& ... ts) { // OK: ts -     printer(std::forward<decltype(ts)>(ts)...); }; }; auto p = vglambda( [](auto v1, auto v2, auto v3) { std::cout << v1 << v2 << v3; } ); p(1, 'a', 3.14); // OK:  1a3.14 


constexpr рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдмрдирд╛рдиреЗ рдкрд░ рд╕рд░рд▓реАрдХреГрдд рдкреНрд░рддрд┐рдмрдВрдз


рд╢реБрд░реВ рдХрд┐рдП рдЧрдП рдмрджрд▓рд╛рд╡реЛрдВ рдХреЛ constexpr рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ constexpr рд╣реИ:

 constexpr int abs(int x) { if (x < 0) x = -x; return x; // OK } constexpr int first(int n) { static int value = n; // :   return value; } constexpr int uninit() { int a; // :   return a; } constexpr int prev(int x) { return --x; } // OK constexpr int g(int x, int n) { // OK int r = 1; while (--n > 0) r *= x; return r; } 

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдПрдХ рдирд┐рдпрдо рдХреЛ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдЬрд┐рд╕рдХреЗ рджреНрд╡рд╛рд░рд╛ рдЧреИрд░-рд╕реНрдереИрддрд┐рдХ рд╕рджрд╕реНрдп рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдПрдХ constexpr рдХреНрд╡рд╛рд▓рд┐рдлрд╛рдпрд░ (рдЗрд╕ рдкрд░ рдЕрдзрд┐рдХ) рдкреНрд░рд╛рдкреНрдд рд╣реБрдЖред

рдкрд░рд┐рд╡рд░реНрддрдиреАрдп рдЯреЗрдореНрдкрд▓реЗрдЯ


рдпрд╣ рд╕реБрд╡рд┐рдзрд╛ рдЖрдкрдХреЛ constexpr рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЗ рд╕рд╛рде рдЕрдзрд┐рдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╕рдВрдпреЛрдЬрди рдХреЗ рд▓рд┐рдП constexpr рд╡реЗрд░рд┐рдПрдмрд▓ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдмрдирд╛рдиреЗ рдФрд░ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИ (рдпрд╣ рди рдХреЗрд╡рд▓ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИ, рдмрд▓реНрдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рджреНрд╡рд╛рд░рд╛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде):
 template<typename T> constexpr T pi = T(3.1415926535897932385); template<typename T> T circular_area(T r) { return pi<T> * r * r; } struct matrix_constants { template<typename T> using pauli = hermitian_matrix<T, 2>; template<typename T> constexpr pauli<T> sigma1 = { { 0, 1 }, { 1, 0 } }; template<typename T> constexpr pauli<T> sigma2 = { { 0, -1i }, { 1i, 0 } }; template<typename T> constexpr pauli<T> sigma3 = { { 1, 0 }, { -1, 0 } }; }; 


рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди


exchange


рдкрд░рдорд╛рдгреБ рд╡рд╕реНрддреБрдПрдВ рдПрдХ atomic_exchange рдлрд╝рдВрдХреНрд╢рди рдкреНрд░рджрд╛рди atomic_exchange рд╣реИрдВ рдЬреЛ рдЖрдкрдХреЛ рдХрд┐рд╕реА рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдПрдХ рдирдпрд╛ рдорд╛рди рдЕрд╕рд╛рдЗрди рдХрд░рдиреЗ рдФрд░ рдЙрд╕рдХрд╛ рдкреБрд░рд╛рдирд╛ рдорд╛рди рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдПрдХ рд╕рдорд╛рди рдХрд╛рд░реНрдп рд╕рд╛рдорд╛рдиреНрдп рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
 //   template<typename T, typename U=T> T exchange(T& obj, U&& new_val) { T old_val = std::move(obj); obj = std::forward<U>(new_val); return old_val; } 

рдЖрджрд┐рдо рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП, рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдирд┐рдпрдорд┐рдд рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╕рдорд╛рди рд╣реИред рдЬрдЯрд┐рд▓ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП, рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдЖрдкрдХреЛ рдЗрд╕рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ:

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, std::unique_ptr::reset рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди std::unique_ptr::reset :
 template<typename T, typename D> void unique_ptr<T, D>::reset(pointer p = pointer()) { pointer old = ptr_; ptr_ = p; if (old) deleter_(old); } 

рдЗрд╕рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
 template<typename T, typename D> void unique_ptr<T, D>::reset(pointer p = pointer()) { if (pointer old = std::exchange(ptr_, p)) deleter_(old); } 


make_unique


C ++ 11 рдореЗрдВ, рд╕реНрдорд╛рд░реНрдЯ рдкреЙрдЗрдВрдЯрд░реНрд╕ рдХреЗ рд╕рд╛рде, make_shared рдЬреИрд╕рд╛ рдПрдХ рдлрдВрдХреНрд╢рди make_shared ред рдпрд╣ рдЖрдкрдХреЛ рд╕рд╛рдЭрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореЗрдореЛрд░реА рдХреЗ рдЖрд╡рдВрдЯрди рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рд╕рд╛рде рд╣реА рдЕрдкрд╡рд╛рджреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реБрд░рдХреНрд╖рд╛ рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд░рддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, unique_ptr рд▓рд┐рдП рдПрдХ рд╕рдорд╛рди рдЕрдиреБрдХреВрд▓рди рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИ, рдЕрдкрд╡рд╛рджреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрдврд╝реА рд╣реБрдИ рд╕реБрд░рдХреНрд╖рд╛ рдХрднреА рднреА рдЪреЛрдЯ рдирд╣реАрдВ рдкрд╣реБрдВрдЪрд╛рдПрдЧреАред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрд╣рд╛рдВ, рджреЛрдиреЛрдВ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рд╣рдо рдПрдХ рдореЗрдореЛрд░реА рд▓реАрдХ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдпрджрд┐ рдПрдХ рд╡рд╕реНрддреБ рдмрдирд╛рддреЗ рд╕рдордп рдПрдХ рдЕрдкрд╡рд╛рдж рдХреЛ рдлреЗрдВрдХ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдФрд░ рджреВрд╕рд░реА рд╡рд╕реНрддреБ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдмрдирд╛рдИ рдЧрдИ рдереА, рд▓реЗрдХрд┐рди рдЕрднреА рддрдХ unique_ptr рдореЗрдВ рдирд╣реАрдВ рд░рдЦреА рдЧрдИ рд╣реИ:
 void foo(std::unique_ptr<A> a, std::unique_ptr<B> b); int main() { foo(new A, new B); foo(std::unique_ptr<A>{new A}, foo(std::unique_ptr<B>{new B}); } 

рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, make_unique рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдЗрд╕ рдкреНрд░рдХрд╛рд░, C ++ 14 рд▓рдЧрднрдЧ рдкреВрд░реА рддрд░рд╣ рд╕реЗ (рдмрд╣реБрдд рджреБрд░реНрд▓рдн рдорд╛рдорд▓реЛрдВ рдХреЗ рдЕрдкрд╡рд╛рдж рдХреЗ рд╕рд╛рде) рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЛ new рдХреЛ рддреНрдпрд╛рдЧрдиреЗ рдФрд░ рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреЛ delete рдХрд░рддрд╛ рд╣реИред
рдЙрдкрдпреЛрдЧ рдЙрджрд╛рд╣рд░рдг:
 #include <iostream> #include <string> #include <memory> using namespace std; void foo(std::unique_ptr<string> a, std::unique_ptr<string> b) {} int main() { cout << *make_unique<int>() << endl; cout << *make_unique<int>(1729) << endl; cout << "\"" << *make_unique<string>() << "\"" << endl; cout << "\"" << *make_unique<string>("meow") << "\"" << endl; cout << "\"" << *make_unique<string>(6, 'z') << "\"" << endl; auto up = make_unique<int[]>(5); for (int i = 0; i < 5; ++i) { cout << up[i] << " "; } cout << endl; foo(make_unique<string>(), make_unique<string>()); //    auto up1 = make_unique<string[]>("error"); //  auto up2 = make_unique<int[]>(10, 20, 30, 40); //  auto up3 = make_unique<int[5]>(); //  auto up4 = make_unique<int[5]>(11, 22, 33, 44, 55); //  } /* Output: 0 1729 "" "meow" "zzzzzz" 0 0 0 0 0 */ 


рдЕрд▓рдЧ рд▓рд╛рдЗрди


рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рдЬрд┐рд╕рдореЗрдВ рдЗрдирдкреБрдЯ / рдЖрдЙрдЯрдкреБрдЯ рдзрд╛рд░рд╛рдУрдВ рдХреЗ рд╕рд╛рде рдПрдХ рд╕реНрдерд╛рди рд╢рд╛рдорд┐рд▓ рд╣реЛрддрд╛ рд╣реИ, рд╣рдореЗрд╢рд╛ рдЕрдкреЗрдХреНрд╖рд┐рдд рдкрд░рд┐рдгрд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд┐рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:
 std::stringstream ss; std::string original = "foolish me"; std::string round_trip; ss << original; ss >> round_trip; std::cout << original; // : foolish me std::cout << round_trip; // : foolish assert(original == round_trip); // assert  

рдпрд╣ рд╕рдВрд╢реЛрдзрди рдорд╛рдирдХ рдореЗрдВ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдкрд░рд┐рдЪрдп рджреЗрддрд╛ рд╣реИ рдЬреЛ рдЖрдкрдХреЛ рдкрдврд╝рддреЗ рд╕рдордп рд▓рд┐рдЦрдиреЗ рдФрд░ рд╣рдЯрд╛рдиреЗ рдХреЗ рджреМрд░рд╛рди рдкрдВрдХреНрддрд┐ рдХреЗ рдЖрд░рдВрдн рдФрд░ рдЕрдВрдд рдореЗрдВ рджреЛрд╣рд░реЗ рдЙрджреНрдзрд░рдг рдЬреЛрдбрд╝рдХрд░ рдРрд╕реА рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рд╕рдВрднрд╛рд▓рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:
 std::stringstream ss; std::string original = "foolish me"; std::string round_trip; ss << quoted(original); ss >> quoted(round_trip); std::cout << original; // : foolish me std::cout << round_trip; // : foolish me assert(original == round_trip); // assert   

рдпрджрд┐ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЕрдкрдиреЗ рдЖрдк рдореЗрдВ рдЙрджреНрдзрд░рдг рдЪрд┐рд╣реНрди рд╣реИрдВ, рддреЛ рдЙрдиреНрд╣реЗрдВ рднреА рдЕрд▓рдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛:
 std::cout << "She said \"Hi!\""; // : She said "Hi!" std::cout << quoted("She said \"Hi!\""); // : "She said \"Hi!\"" 

рдпрд╣ рд╕рдВрд╢реЛрдзрди рдмреВрд╕реНрдЯ рдХрд╛рдЙрдВрдЯрд░рдкрд╛рд░реНрдЯ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИ ред

рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдХрд╕реНрдЯрдо рд╕рд╛рд╣рд┐рддреНрдп


рд╕реА ++ 11 рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╢рд╛рдмреНрджрд┐рдХ (рдкреАрдПрд▓) рдХреА рдЕрд╡рдзрд╛рд░рдгрд╛ рдХреЛ рдкреЗрд╢ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдПрдХ рднреА рдкреАрдПрд▓ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдорд╛рдирдХ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдЧреИрд░-рдЕрдВрдбрд░рд╕реНрдХреЛрд░ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рдкреАрдПрд▓ рдХреЗ рдирд╛рдо рдПрд╕рдЯреАрдПрд▓ рдХреЗ рд▓рд┐рдП рдЖрд░рдХреНрд╖рд┐рдд рд╣реИрдВред
рд╕рдВрдмрдВрдзрд┐рдд рд╕рдВрд╢реЛрдзрди рдорд╛рдирдХ рдХреЗ рд▓рд┐рдП рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╢рд╛рдмреНрджрд┐рдХ рдЬреЛрдбрд╝рддрд╛ рд╣реИ:
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:
 auto mystring = "hello world"s; //  std::string auto mytime = 42ns; //  chrono::nanoseconds 

рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд╢рд╛рдмреНрджрд┐рдХ рд╕рдВрдШрд░реНрд╖ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддреЗ рд╣реИрдВред

optional


рдпрд╣ рд╕рдВрд╢реЛрдзрди рдПрдХ рд╡реИрдХрд▓реНрдкрд┐рдХ рд╡рд╕реНрддреБ рдХреЛ рджрд░реНрд╢рд╛рддрд╛ рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ рдПрдХ рдирдП рдкреНрд░рдХрд╛рд░ рдХрд╛ рдкрд░рд┐рдЪрдп рджреЗрддрд╛ рд╣реИред рд╕рдВрднрд╡ рдЙрдкрдпреЛрдЧ:

рдЙрдкрдпреЛрдЧ рдХреА рдПрдХ рдЕрдиреБрдорд╛рдирд┐рдд рд╡рд┐рдзрд┐:
 optional<int> str2int(string); //     ,   int get_int_form_user() { string s; for (;;) { cin >> s; optional<int> o = str2int(s); // 'o'    ,     if (o) { //   'o'  ? return *o; //   } } } 

рдпрд╣ рд╕рдВрд╢реЛрдзрди рдмреВрд╕реНрдЯ рдХрд╛рдЙрдВрдЯрд░рдкрд╛рд░реНрдЯ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИ ред
рдЗрд╕ рд╡рд░реНрдЧ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд▓реЗрдЦрдХ рдХреЗ рд▓реЗрдЦ рдХрд╛ рдЕрдиреБрд╡рд╛рдж рдпрд╣рд╛рдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ ред

shared_mutex рдФрд░ shared_lock


рдмрд╣реБ-рдереНрд░реЗрдбреЗрдб рдкреНрд░реЛрдЧреНрд░рд╛рдо рд╡рд┐рдХрд╕рд┐рдд рдХрд░рддреЗ рд╕рдордп, рдХрднреА-рдХрднреА рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдПрдХ рд╡рд╕реНрддреБ рдХреЛ рдХрдИ рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдкрдврд╝рд╛ рдЬрд╛ рд╕рдХреЗ рдпрд╛ рдЕрджреНрд╡рд┐рддреАрдп рд▓реЗрдЦрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗред рдпрд╣ рд╕рдВрд╢реЛрдзрди рдЗрд╕ рдЙрджреНрджреЗрд╢реНрдп рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдП рдЧрдП рдорд╛рдирдХ shared_mutex рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдореЗрдВ рдЬреЛрдбрд╝рддрд╛ рд╣реИред lock рдлрд╝рдВрдХреНрд╢рди рдЕрджреНрд╡рд┐рддреАрдп рдкрд╣реБрдВрдЪ рджреЗрддрд╛ рд╣реИ, рдФрд░ рдЗрд╕реЗ рдкрд╣рд▓реЗ рдЬреЛрдбрд╝реЗ рдЧрдП lock_guard рдФрд░ unique_lock рд╕рд╛рде рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд╕рд╛рдЭрд╛ рдкрд╣реБрдВрдЪ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ lock_shared рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдФрд░ рдпрд╣ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ RAII shared_lock рдорд╛рдзреНрдпрдо рд╕реЗ рдРрд╕рд╛ рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реИ:
 using namespace std; shared_mutex rwmutex; { shared_lock<shared_mutex> read_lock(rwmutex); //  } { unique_lock<shared_mutex> write_lock(rwmutex); //  lock_guard //  } 

рдпрд╣ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ рдХрд┐рд╕реА рднреА рд▓реЙрдХ рдХреА рд▓рд╛рдЧрдд, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдХ рдирд┐рдпрдорд┐рдд рдореНрдпреВрдЯреЗрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рдорд╣рдВрдЧрд╛ рд╣реИред
рдпрд╣ рд╕рдВрд╢реЛрдзрди рдмреВрд╕реНрдЯ рдХрд╛рдЙрдВрдЯрд░рдкрд╛рд░реНрдЯ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИ ред

dynarray


рд╡рд░реНрддрдорд╛рди рд╕реА рдорд╛рдирдХ рдореЗрдВ рдЧрддрд┐рд╢реАрд▓ рд╕рд░рдгрд┐рдпрд╛рдБ рд╣реИрдВ, рдЬрд┐рдирдХрд╛ рдЖрдХрд╛рд░ рдХреЗрд╡рд▓ рд░рди рд╕рдордп рдкрд░ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдирд┐рдпрдорд┐рдд рд╕рд░рдгрд┐рдпреЛрдВ рдХреА рддрд░рд╣, рд╡реЗ рдЬреЛ рдбреЗрдЯрд╛ рдмрдирд╛рддреЗ рд╣реИрдВ рд╡рд╣ рд╕реНрдЯреИрдХ рдкрд░ рд╣реЛрддрд╛ рд╣реИред C ++ 14 рдРрд╕реЗ рд╕рд░рдгрд┐рдпреЛрдВ рдХрд╛ рджрд╛рд╡рд╛ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдЕрдкрдиреА рддрд░рд╣ рдХреЗ рдЧрддрд┐рд╢реАрд▓ рд╕рд░рдгреА рдХреЛ рднреА рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ - std::dynarray , рдЬреЛ рд░рдирдЯрд╛рдЗрдо рдкрд░ рдЕрдкрдиреЗ рдЖрдХрд╛рд░ рдХреЛ рднреА рдкрд╣рдЪрд╛рдирддрд╛ рд╣реИ рдФрд░ рдмрд╛рдж рдореЗрдВ рдЗрд╕реЗ рдмрджрд▓ рдирд╣реАрдВ рд╕рдХрддрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╣ рдпрд╛ рддреЛ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЛ рд╕реНрдЯреИрдХ рдкрд░ рд░рдЦ рд╕рдХрддрд╛ рд╣реИ, рдпрд╛ рдЙрдиреНрд╣реЗрдВ рдвреЗрд░ рдкрд░ рд░рдЦреЗрдВ, рдЬрдмрдХрд┐ std::array рдФрд░ std::vector рд╕рдорд╛рди рдХрдИ рддрд░реАрдХреЛрдВ рд╕реЗ рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╣реИред рд╕рдВрд╢реЛрдзрди рдХреЗ рдЕрдиреБрд╕рд╛рд░, рд╕реНрдЯреИрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП, рдЗрд╕ рд╡рд░реНрдЧ рдХреЛ рд╕рдВрдХрд▓рдХ рджреНрд╡рд╛рд░рд╛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдирд┐рд╖реНрдХрд░реНрд╖


рдореВрд▓ рд░реВрдк рд╕реЗ, C ++ 14 рдХреЛ рдПрдХ рдорд╛рдореВрд▓реА рдмрдЧ-рдлрд┐рдХреНрд╕ рд░рд┐рд▓реАрдЬрд╝ рдХреЗ рд░реВрдк рдореЗрдВ рддреИрдирд╛рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЬреЛ рд╕рдордп рд╕реАрдорд╛ рдХреЗ рдХрд╛рд░рдг рдпрд╛ рдХреБрдЫ рдЕрдиреНрдп рдХрд╛рд░рдгреЛрдВ рд╕реЗ рдХрд┐рдП рдЧрдП C ++ 11 рдХреА рдХрдорд┐рдпреЛрдВ рдХреЛ рдареАрдХ рдХрд░рддрд╛ рд╣реИред рд╕реА ++ рдорд╛рдирдХ рдХрд╛ рд╡рд░реНрддрдорд╛рди рдорд╕реМрджрд╛ рдпрд╣рд╛рдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ ред

рдЕрджреНрдпрддрди:
dynarray рдФрд░ optional рдХреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рддрдХрдиреАрдХреА рд╡рд┐рд╢рд┐рд╖реНрдЯрддрд╛рдУрдВ рдореЗрдВ рд░рдЦрд╛ рдЧрдпрд╛ рдерд╛ред
рдирдИ C ++ 14 рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХрд╛ рдЕрд╡рд▓реЛрдХрди: рднрд╛рдЧ 2

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


All Articles