рднрд╡рд┐рд╖реНрдп рдХреЗ "C ++" рдореЗрдВ рдирд┐рдпрддрд╛рддреНрдордХ рдЕрдкрд╡рд╛рдж рдФрд░ рддреНрд░реБрдЯрд┐ рд╕реЗ рдирд┐рдкрдЯрдиреЗ


рдпрд╣ рдЕрдЬреАрдм рдмрд╛рдд рд╣реИ рдХрд┐ рд╣рдмреНрд░рдд рдкрд░ рдЕрднреА рддрдХ C ++ рдорд╛рдирдХ рдХреЗ рд▓рд┐рдП рдПрдХ "рдЬрд╝реАрд░реЛ-рдУрд╡рд░рд╣реЗрдб рдирд┐рд░реНрдзрд╛рд░рдХ рдЕрдкрд╡рд╛рдж" рдирд╛рдордХ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд╛ рдХреЛрдИ рдЙрд▓реНрд▓реЗрдЦ рдирд╣реАрдВ рдерд╛ред рдЗрд╕ рдХрд╖реНрдЯрдкреНрд░рдж рдЪреВрдХ рдХреЛ рд╕реБрдзрд╛рд░рдирд╛ред


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


рдиреАрдЪреЗ рдЪрд░реНрдЪрд╛ рди рдХреЗрд╡рд▓ рд╕реНрдереИрддрд┐рдХ рдЕрдкрд╡рд╛рджреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ, рдмрд▓реНрдХрд┐ рдорд╛рдирдХ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдкреНрд░рд╕реНрддрд╛рд╡реЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ, рдФрд░ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рдЕрдиреНрдп рд╕рднреА рддрд░реАрдХреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рднреА рдЖрдпреЛрдЬрд┐рдд рдХреА рдЬрд╛рдПрдЧреАред рдпрджрд┐ рдЖрдк рдпрд╣рд╛рдБ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЛ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЧрдП рд╣реИрдВ, рддреЛ рдпрд╣рд╛рдБ рдпрд╣ рд╣реИ:


double safe_divide(int x, int y) throws(arithmetic_error) { if (y == 0) { throw arithmetic_error::divide_by_zero; } else { return as_double(x) / y; } } void caller() noexcept { try { cout << safe_divide(5, 2); } catch (arithmetic_error e) { cout << e; } } 

рдпрджрд┐ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкреНрд░рдХрд╛рд░ рдХреА рддреНрд░реБрдЯрд┐ рдорд╣рддреНрд╡рд╣реАрди / рдЕрдЬреНрдЮрд╛рдд рд╣реИ, рддреЛ рдЖрдк рдХреЗрд╡рд▓ throws рдФрд░ catch (std::error e) рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред


рдЬрд╛рдирдХрд░ рдЕрдЪреНрдЫрд╛ рд▓рдЧрд╛


std::optional рдФрд░ std::expected


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


 uintmax_t file_size(const path& p, error_code& ec); 

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


рдкрд┐рдЫрд▓реЗ рдХреБрдЫ рд╕рдордп рд╕реЗ, рдмреВрд╕реНрдЯ рдРрд╕реА "рдЧреИрд░-рдШрд╛рддрдХ" рддреНрд░реБрдЯрд┐рдпреЛрдВ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реБрд░реБрдЪрд┐рдкреВрд░реНрдг рд╕рдорд╛рдзрд╛рди рдХреА рдкреЗрд╢рдХрд╢ рдХрд░ рд░рд╣рд╛ рд╣реИ, рдЬреЛ рдХреБрдЫ рдирд┐рд╢реНрдЪрд┐рдд рдкрд░рд┐рджреГрд╢реНрдпреЛрдВ рдореЗрдВ рд╕рд╣реА рдХрд╛рд░реНрдпрдХреНрд░рдо рдореЗрдВ рд╕реИрдХрдбрд╝реЛрдВ рджреНрд╡рд╛рд░рд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ:


 expected<uintmax_t, error_code> file_size(const path& p); 

expected рдкреНрд░рдХрд╛рд░ variant рд╕рдорд╛рди рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ "рдкрд░рд┐рдгрд╛рдо" рдФрд░ "рддреНрд░реБрдЯрд┐" рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, expected рдкрд░рд┐рдгрд╛рдо expected рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реЛрддрд╛ expected ред file_size рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦ рд╕рдХрддрд╛ рд╣реИ:


 file_info* info = read_file_info(p); if (info != null) { uintmax_t size = info->size; return size; // <== } else { error_code error = get_error(); return std::unexpected(error); // <== } 

рдпрджрд┐ рддреНрд░реБрдЯрд┐ рдХрд╛ рдХрд╛рд░рдг рд╣рдорд╛рд░реЗ рд▓рд┐рдП рджрд┐рд▓рдЪрд╕реНрдк рдирд╣реАрдВ рд╣реИ, рдпрд╛ рддреНрд░реБрдЯрд┐ рдХреЗрд╡рд▓ рдкрд░рд┐рдгрд╛рдо рдХреА "рдЕрдиреБрдкрд╕реНрдерд┐рддрд┐" рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реЛ рд╕рдХрддреА рд╣реИ, рддреЛ optional рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:


 optional<int> parse_int(const std::string& s); optional<U> get_or_null(map<T, U> m, const T& key); 

рдмреВрд╕реНрдЯ рд╕реЗ рд╕реА ++ 17 рдореЗрдВ, рд╡реИрдХрд▓реНрдкрд┐рдХ рдПрд╕рдЯреАрдбреА рдЖрдпрд╛ ( optional<T&> рд▓рд┐рдП рд╕рдорд░реНрдерди рдХреЗ рдмрд┐рдирд╛); C ++ 20 рдореЗрдВ, рд╡реЗ рдЕрдкреЗрдХреНрд╖рд┐рдд рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ (рдпрд╣ рдХреЗрд╡рд▓ рдкреНрд░рд╕реНрддрд╛рд╡ рд╣реИ, рд╕реБрдзрд╛рд░ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж RamzesXI )ред


рд╕рдВрд╡рд┐рджрд╛


рдХреЙрдиреНрдЯреНрд░реИрдХреНрдЯреНрд╕ (рдЕрд╡рдзрд╛рд░рдгрд╛рдУрдВ рдХреЗ рд╕рд╛рде рднреНрд░рдорд┐рдд рдирд╣реАрдВ рд╣реЛрдирд╛) рдлрд╝рдВрдХреНрд╢рди рдорд╛рдкрджрдВрдбреЛрдВ рдкрд░ рдкреНрд░рддрд┐рдмрдВрдз рд▓рдЧрд╛рдиреЗ рдХрд╛ рдПрдХ рдирдпрд╛ рддрд░реАрдХрд╛ рд╣реИ, C ++ 20 рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рд╣реИред 3 рдПрдиреЛрдЯреЗрд╢рди рдЬреЛрдбрд╝реЗ рдЧрдП:


  • рд╕рдорд╛рд░реЛрд╣ рдорд╛рдкрджрдВрдбреЛрдВ рдХреА рдЬрд╛рдБрдЪ рдХрд░рддрд╛ рд╣реИ
  • рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рд░рд┐рдЯрд░реНрди рдорд╛рди рдЪреЗрдХ рдХрд┐рдпрд╛ рдЬрд╛рдП (рдЗрд╕реЗ рдПрдХ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ)
  • рдореБрдЦрд░ - рдореИрдХреНрд░реЛ рдореБрдЦрд░ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рднреНрдп рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди

 double unsafe_at(vector<T> v, size_t i) [[expects: i < v.size()]]; double sqrt(double x) [[expects: x >= 0]] [[ensures ret: ret >= 0]]; value fetch_single(key e) { vector<value> result = fetch(vector<key>{e}); [[assert result.size() == 1]]; return v[0]; } 

рдЖрдк рдЕрдиреБрдмрдВрдз рдХреЗ рдЙрд▓реНрд▓рдВрдШрди рдХреЗ рд▓рд┐рдП рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:


  • рдЬрд┐рд╕реЗ рдЕрд╡рд┐рднрд╛рдЬрд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдпрд╛
  • рдЗрд╕рдиреЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рдиреЗ рдХреА рдЬрд╛рдБрдЪ рдХреА рдФрд░ рдмреБрд▓рд╛рдпрд╛, рдЬрд┐рд╕рдХреЗ рдмрд╛рдж std::terminate

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


std :: error_code


C ++ 11 рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ <system_error> рд▓рд╛рдЗрдмреНрд░реЗрд░реА, рдЖрдкрдХреЛ рдЕрдкрдиреЗ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдореЗрдВ рддреНрд░реБрдЯрд┐ рдХреЛрдб рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреЗ рдорд╛рдирдХреАрдХрд░рдг рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред std :: error_code рдореЗрдВ рдЯрд╛рдЗрдк рд╡рдВрд╢ рдХреЗ рддреНрд░реБрдЯрд┐ рдХреЛрдб рдФрд░ рдХреБрдЫ рд╡рдВрд╢рдЬ рд╡рд░реНрдЧ рдХреЗ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреЙрдЗрдВрдЯрд░ рд╢рд╛рдорд┐рд▓ рд╣реЛрддрд╛ рд╣реИ :: error_category ред рдпрд╣ рдСрдмреНрдЬреЗрдХреНрдЯ, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╡рд░реНрдЪреБрдЕрд▓ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреА рддрд╛рд▓рд┐рдХрд╛ рдХреА рднреВрдорд┐рдХрд╛ рдирд┐рднрд╛рддрд╛ рд╣реИ рдФрд░ рджрд┐рдП рдЧрдП std::error_code рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИред


рдЕрдкрдирд╛ std::error_code рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЕрдкрдиреЗ std::error_category рд╡рдВрд╢рдЬ std::error_category рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рдЖрднрд╛рд╕реА рддрд░реАрдХреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдЬрд┐рдирдореЗрдВ рд╕реЗ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ:


 virtual std::string message(int c) const = 0; 

рдЖрдкрдХреЛ рдЕрдкрдиреЗ std::error_category рд▓рд┐рдП рдПрдХ рд╡реИрд╢реНрд╡рд┐рдХ рдЪрд░ рднреА рдмрдирд╛рдирд╛ рд╣реЛрдЧрд╛ред рдПрд░рд░_рдХреЛрдб + рдЕрдкреЗрдХреНрд╖рд┐рдд рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рддреНрд░реБрдЯрд┐ рдХреЛ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рд╕реЗ рджреЗрдЦрддрд╛ рд╣реИ:


 template <typename T> using result = expected<T, std::error_code>; my::file_handle open_internal(const std::string& name, int& error); auto open_file(const std::string& name) -> result<my::file> { int raw_error = 0; my::file_handle maybe_result = open_internal(name, &raw_error); std::error_code error{raw_error, my::filesystem_error}; if (error) { return unexpected{error}; } else { return my::file{maybe_result}; } } 

рдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ std::error_code 0 рдХрд╛ рдорд╛рди рдХреЛрдИ рддреНрд░реБрдЯрд┐ рдирд╣реАрдВ рд╣реИред рдпрджрд┐ рдпрд╣ рдЖрдкрдХреА рддреНрд░реБрдЯрд┐ рдХреЛрдб рдХреЗ рд▓рд┐рдП рдорд╛рдорд▓рд╛ рдирд╣реАрдВ рд╣реИ, рддреЛ рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рдЖрдк рд╕рд┐рд╕реНрдЯрдо рддреНрд░реБрдЯрд┐ рдХреЛрдб рдХреЛ std::error_code рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░реЗрдВ, рдЖрдкрдХреЛ рдХреЛрдб 0 рдХреЛ SUCCESS рдФрд░ рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд рдмрджрд▓рдирд╛ рд╣реЛрдЧрд╛ред


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


рд╡рд┐рдирд╛рд╢рдХрд╛рд░реА рдЪрд╛рд▓ / рддреБрдЪреНрдЫ рд╕реНрдерд╛рди


рдЖрдкрдХреЛ рд╡рд╕реНрддреБрдУрдВ рдХрд╛ рдПрдХ рдФрд░ рд╡рд░реНрдЧ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬреЛ рдХреБрдЫ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХрд╛ рдорд╛рд▓рд┐рдХ рд╣реИред рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ, рдЖрдк рдЗрд╕реЗ рдЧреИрд░-рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдмрдирд╛рдиреЗ рдпреЛрдЧреНрдп рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЬрдВрдЧрдо, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЕрд╕рдореНрдмрджреНрдз рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ (рд╕реА ++ 17 рд╕реЗ рдкрд╣рд▓реЗ рдЙрдиреНрд╣реЗрдВ рдПрдХ рд╕рдорд╛рд░реЛрд╣ рд╕реЗ рд╡рд╛рдкрд╕ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ)ред


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


рдПрдХ рдФрд░ рд╕рдорд╕реНрдпрд╛ рдкреБрд░рд╛рдиреА рд╡рд╕реНрддреБрдУрдВ рдХреА рдЬрд╝реАрд░реЛрдЗрдВрдЧ рд╣реИ рдЬрдм рдЪрд▓рддреА рд╣реИ рдПрдХ рдУрд╡рд░рд╣реЗрдб рдЬреЛрдбрд╝рддрд╛ рд╣реИ: std::vector<std::unique_ptr<T>> рднрд░рдирд╛ std::vector<std::unique_ptr<T>> std::vector<T*> рдХреА рддреБрд▓рдирд╛ рдореЗрдВ 2 рдЧреБрдирд╛ рдзреАрдорд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ std::vector<T*> рдкреБрд░рд╛рдиреЗ std::vector<std::unique_ptr<T>> рдХреЗ рдвреЗрд░ рдХреЗ рдХрд╛рд░рдг рдЬрдм рдЪрд▓рддреА рд╣реИ , рдбрдореА рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреЗ рдмрд╛рджред


рд╕реА ++ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдиреЗ рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдЬрдВрдЧ рдкрд░ рдкрд╛рд▓рд╛ рд╣реИ, рдЬрд╣рд╛рдВ рд╡рд┐рдзреНрд╡рдВрд╕рдХ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рд╡рд╕реНрддреБрдУрдВ рдкрд░ рдирд╣реАрдВ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреЛ рд╡рд┐рдирд╛рд╢рдХрд╛рд░реА рдЪрд╛рд▓ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдкреНрд░рд╕реНрддрд╛рд╡ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдкреНрд░рд╕реНрддрд╛рд╡ C ++ рдореЗрдВ рдЬреЛрдбрд╝рдиреЗ рдХреА рдкреЗрд╢рдХрд╢ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдУрд╡рд░рд╣реЗрдб рд╕рдорд╕реНрдпрд╛ рд╣рд▓ рд╣реЛ рдЬрд╛рдПрдЧреАред


рдпрджрд┐ рджреЛ рдСрдкрд░реЗрд╢рди: рдкреБрд░рд╛рдиреА рд╡рд╕реНрддреБ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдирд╛ рдФрд░ рд╣рдЯрд╛рдирд╛ рдкреБрд░рд╛рдиреА рд╡рд╕реНрддреБ рд╕реЗ рдирдП рдХреЗ рд▓рд┐рдП рдпрд╛рджрдЧрд╛рд░ рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИ, рддреЛ рдПрдХ рд╡рд░реНрдЧ рдХреЛ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред рдкреБрд░рд╛рдиреА рд╡рд╕реНрддреБ рдХреЛ рд╣рдЯрд╛рдпрд╛ рдирд╣реАрдВ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдЦрдХ рдЗрд╕реЗ "рдлрд░реНрд╢ рдкрд░ рдЫреЛрдбрд╝рдирд╛" рдХрд╣рддреЗ рд╣реИрдВред


рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкреНрд░рдХрд╛рд░ рдХреА рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╕рд╣реА рд╣реЛрдиреЗ рдкрд░ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рддреНрд░реИрдорд╛рд╕рд┐рдХ рдмрд┐рдВрджреБ рд╕реЗ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рддреНрд░реИрдорд╛рд╕рд┐рдХ рд╕рдВрдмрдВрдз рд╣реИ:


  1. рдпрд╣ рддреБрдЪреНрдЫ рд░реВрдк рд╕реЗ рдЬрдВрдЧрдо + рддреБрдЪреНрдЫ рд╡рд┐рдирд╛рд╢рдХрд╛рд░реА рд╣реИ (рдЙрджрд╛рд╣рд░рдг int рдпрд╛ POD рд╕рдВрд░рдЪрдирд╛)
  2. рдпрд╣ [[trivially_relocatable]] рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рд╕рд╛рде рдЪрд┐рд╣реНрдирд┐рдд рд╡рд░реНрдЧ рд╣реИ [[trivially_relocatable]]
  3. рдпрд╣ рдПрдХ рдРрд╕рд╛ рд╡рд░реНрдЧ рд╣реИ рдЬрд┐рд╕рдХреЗ рд╕рднреА рд╕рджрд╕реНрдп рддреНрд░реИрдорд╛рд╕рд┐рдХ рд░реВрдк рд╕реЗ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рд╣реЛрддреЗ рд╣реИрдВред

рдЖрдк рдЗрд╕ рдЬрд╛рдирдХрд╛рд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ std::uninitialized_relocate рд╕рд╛рде рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рд╕рд╛рдорд╛рдиреНрдп рддрд░реАрдХреЗ рд╕реЗ рдореВрд╡ рдЗрдирд┐рдЯ + рдбрд┐рд▓реАрдЯ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддрд╛ рд╣реИ, рдпрд╛ рдпрджрд┐ рд╕рдВрднрд╡ рд╣реЛ рддреЛ рддреНрд╡рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ [[trivially_relocatable]] рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рдЕрдзрд┐рдХрд╛рдВрд╢ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░рдиреЗ рдХрд╛ рд╕реБрдЭрд╛рд╡ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ std::string , std::vector , std::unique_ptr ред рдУрд╡рд░рд╣реЗрдб std::vector<std::unique_ptr<T>> рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддреЗ рд╣реБрдП рдкреНрд░рд╕реНрддрд╛рд╡ рдЧрд╛рдпрдм рд╣реЛ рдЬрд╛рдПрдЧрд╛ред


рдЕрдм рдЕрдкрд╡рд╛рджреЛрдВ рдореЗрдВ рдХреНрдпрд╛ рдЧрд▓рдд рд╣реИ?


рд╕реА ++ рдЕрдкрд╡рд╛рдж рддрдВрддреНрд░ 1992 рдореЗрдВ рд╡рд┐рдХрд╕рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рд╡рд┐рднрд┐рдиреНрди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╡рд┐рдХрд▓реНрдк рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдХрд┐рдП рдЧрдП рд╣реИрдВред рдЗрдирдореЗрдВ рд╕реЗ, рдПрдХ рдЕрдкрд╡рд╛рдж рддрд╛рд▓рд┐рдХрд╛ рддрдВрддреНрд░ рдХрд╛ рдЪрдпрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдЬреЛ рдХрд╛рд░реНрдпрдХреНрд░рдо рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рдореБрдЦреНрдп рдкрде рдХреЗ рд▓рд┐рдП рдУрд╡рд░рд╣реЗрдб рдХреА рдЕрдиреБрдкрд╕реНрдерд┐рддрд┐ рдХреА рдЧрд╛рд░рдВрдЯреА рджреЗрддрд╛ рд╣реИред рдХреНрдпреЛрдВрдХрд┐ рдЙрдирдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рдЙрд╕реА рдХреНрд╖рдг рд╕реЗ, рдпрд╣ рдорд╛рди рд▓рд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдХрд┐ рдЕрдкрд╡рд╛рджреЛрдВ рдХреЛ рдмрд╣реБрдд рдХрдо рд╣реА рдлреЗрдВрдХрдирд╛ рдЪрд╛рд╣рд┐рдП ред


рдЧрддрд┐рд╢реАрд▓ рдХреЗ рдиреБрдХрд╕рд╛рди (рдпрд╛рдиреА рдирд┐рдпрдорд┐рдд) рдЕрдкрд╡рд╛рдж:


  1. рдлреЗрдВрдХреЗ рдЧрдП рдЕрдкрд╡рд╛рдж рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдУрд╡рд░рд╣реЗрдб рдФрд╕рддрди 10,000-100,000 рд╕реАрдкреАрдпреВ рдЪрдХреНрд░реЛрдВ рдкрд░ рд╣реЛрддрд╛ рд╣реИ, рдФрд░ рд╕рдмрд╕реЗ рдЦрд░рд╛рдм рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдпрд╣ рдорд┐рд▓реАрд╕реЗрдХрдВрдб рдХреЗ рдХреНрд░рдо рддрдХ рдкрд╣реБрдВрдЪ рд╕рдХрддрд╛ рд╣реИ
  2. рдмрд╛рдЗрдирд░реА рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдЖрдХрд╛рд░ 15-38% рдмрдврд╝рд╛
  3. C рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рд╕рд╛рде рдЕрд╕рдВрдЧрддрд┐
  4. noexcept рдХреЛ рдЫреЛрдбрд╝рдХрд░ рд╕рднреА рдлрдВрдХреНрд╢рдиреНрд╕ рдореЗрдВ noexcept рдЕрдкрд╡рд╛рдж рдереНрд░реЛ рд╕рдкреЛрд░реНрдЯред рдПрдХ рдЕрдкрд╡рд╛рдж рдХрд╛рд░реНрдпрдХреНрд░рдо рдореЗрдВ рд▓рдЧрднрдЧ рдХрд╣реАрдВ рднреА рдлреЗрдВрдХрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЬрд╣рд╛рдВ рдлрд╝рдВрдХреНрд╢рди рд▓реЗрдЦрдХ рдХреЛ рдЗрд╕рдХреА рдЙрдореНрдореАрдж рдирд╣реАрдВ рд╣реИ

рдЗрди рдХрдорд┐рдпреЛрдВ рдХреЗ рдХрд╛рд░рдг, рдЕрдкрд╡рд╛рджреЛрдВ рдХрд╛ рджрд╛рдпрд░рд╛ рдХрд╛рдлреА рд╕реАрдорд┐рдд рд╣реИред рдЬрдм рдЕрдкрд╡рд╛рдж рд▓рд╛рдЧреВ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреЗ:


  1. рдЬрд╣рд╛рдВ рдирд┐рдпрддрддреНрд╡рд╡рд╛рдж рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ, рдЕрд░реНрдерд╛рддреН рдЬрд╣рд╛рдВ рдпрд╣ рдЕрд╕реНрд╡реАрдХрд╛рд░реНрдп рд╣реИ рдХрд┐ рдХреЛрдб "рдХрднреА-рдХрднреА" 10, 100, 1000 рдЧреБрдирд╛ рд╕рд╛рдорд╛рдиреНрдп рд╕реЗ рдЕрдзрд┐рдХ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ
  2. рдЬрдм рд╡реЗ рдПрдмреАрдЖрдИ рдореЗрдВ рд╕рдорд░реНрдерд┐рдд рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдорд╛рдЗрдХреНрд░реЛрдХрдВрдЯреНрд░реЛрд▓рд░ рдореЗрдВ
  3. рдЬрдм рдХреЛрдб рдХрд╛ рдПрдХ рдмрдбрд╝рд╛ рд╣рд┐рд╕реНрд╕рд╛ C рдореЗрдВ рд▓рд┐рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ
  4. рд╡рд┐рд░рд╛рд╕рдд рдХреЛрдб ( Google рд╢реИрд▓реА рдЧрд╛рдЗрдб , Qt ) рдХреЗ рдПрдХ рдмрдбрд╝реЗ рднрд╛рд░ рд╡рд╛рд▓реА рдХрдВрдкрдирд┐рдпреЛрдВ рдореЗрдВред рдпрджрд┐ рдХреЛрдб рдореЗрдВ рдХрдо рд╕реЗ рдХрдо рдПрдХ рдЧреИрд░-рдЕрдкрд╡рд╛рдж-рд╕реБрд░рдХреНрд╖рд┐рдд рдлрд╝рдВрдХреНрд╢рди рд╣реИ, рддреЛ рдореАрдирд┐рдВрдЧ рдСрдл рд▓реЙ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдпрд╛ рдмрд╛рдж рдореЗрдВ рдЗрд╕рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдПрдХ рдЕрдкрд╡рд╛рдж рдлреЗрдВрдХ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдФрд░ рдПрдХ рдмрдЧ рдмрдирд╛рдПрдВ
  5. рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЛ рдХрд╛рдо рдкрд░ рд░рдЦрдиреЗ рд╡рд╛рд▓реА рдХрдВрдкрдирд┐рдпреЛрдВ рдореЗрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдЕрдкрд╡рд╛рдж рд╕реБрд░рдХреНрд╖рд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреЛрдИ рдЬрд╛рдирдХрд╛рд░реА рдирд╣реАрдВ рд╣реИ

рд╕рд░реНрд╡реЗрдХреНрд╖рдгреЛрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░, 52% (!) рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рдХрд╛рд░реНрдпрд╕реНрдерд▓реЛрдВ рдореЗрдВ, рдЕрдкрд╡рд╛рдж рдХреЙрд░реНрдкреЛрд░реЗрдЯ рдирд┐рдпрдореЛрдВ рджреНрд╡рд╛рд░рд╛ рдирд┐рд╖рд┐рджреНрдз рд╣реИрдВред


рд▓реЗрдХрд┐рди рдЕрдкрд╡рд╛рдж рд╕реА ++ рдХрд╛ рдПрдХ рдЕрднрд┐рдиреНрди рд╣рд┐рд╕реНрд╕рд╛ рд╣реИрдВ! -fno-exceptions рдзреНрд╡рдЬ рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рдХреЗ, рдбреЗрд╡рд▓рдкрд░реНрд╕ рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣рд┐рд╕реНрд╕реЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдЦреЛ рджреЗрддреЗ рд╣реИрдВред рдпрд╣ рдЖрдЧреЗ рдХрдВрдкрдирд┐рдпреЛрдВ рдХреЛ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ "рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ" рдХреЛ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдХрд╕рд╛рддрд╛ рд╣реИ рдФрд░ рд╣рд╛рдВ, рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреНрд▓рд╛рд╕ рдХрд╛ рдЖрд╡рд┐рд╖реНрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИред


рд▓реЗрдХрд┐рди рдпрд╣ рдЕрдВрдд рдирд╣реАрдВ рд╣реИред рдирд┐рд░реНрдорд╛рдг рдореЗрдВ рдХрд┐рд╕реА рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЛ рд░рджреНрдж рдХрд░рдиреЗ рдФрд░ рддреНрд░реБрдЯрд┐ рдХреЛ рдлреЗрдВрдХрдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрд╡рд╛рдж рдПрдХрдорд╛рддреНрд░ рдорд╛рдирдХ рддрд░реАрдХрд╛ рд╣реИред рдЬрдм рдЙрдиреНрд╣реЗрдВ рдмрдВрдж рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рджреЛ-рдЪрд░рдг рдХреЗ рдкреНрд░рд╛рд░рдВрдн рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рдШреГрдгрд╛ рдкреНрд░рдХрдЯ рд╣реЛрддреА рд╣реИред рдСрдкрд░реЗрдЯрд░ рднреА рддреНрд░реБрдЯрд┐ рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдЙрдиреНрд╣реЗрдВ assign рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд╕рд╛рде рдмрджрд▓ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред


рдкреНрд░рд╕реНрддрд╛рд╡: рднрд╡рд┐рд╖реНрдп рдХреЗ рдЕрдкрд╡рд╛рдж


рдирдпрд╛ рдЕрдкрд╡рд╛рдж рд╣рд╕реНрддрд╛рдВрддрд░рдг рддрдВрддреНрд░


P709 рдореЗрдВ рд╣рд░реНрдм рд╕рдЯрд░ рдиреЗ рдПрдХ рдирдП рдЕрдкрд╡рд╛рдж рд╣рд╕реНрддрд╛рдВрддрд░рдг рддрдВрддреНрд░ рдХрд╛ рд╡рд░реНрдгрди рдХрд┐рдпрд╛ред рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рдлрд╝рдВрдХреНрд╢рди std::expected , рд╣рд╛рд▓рд╛рдВрдХрд┐, bool рдкреНрд░рдХрд╛рд░ рдХреЗ рдПрдХ рдЕрд▓рдЧ рднреЗрджрднрд╛рд╡ рдХреЗ рдмрдЬрд╛рдп, рдЬреЛ рд╕рдВрд░реЗрдЦрдг рдХреЗ рд╕рд╛рде рдорд┐рд▓рдХрд░ рд╕реНрдЯреИрдХ рдкрд░ 8 рдмрд╛рдЗрдЯреНрд╕ рддрдХ рдХрдмреНрдЬрд╛ рдХрд░ рд▓реЗрдЧрд╛, рдЗрд╕ рдмрд┐рдЯ рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рдХреБрдЫ рддреЗрдЬрд╝ рддрд░реАрдХреЗ рд╕реЗ рдкреНрд░реЗрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХреИрд░реА рдлреНрд▓реИрдЧред


рдлрд╝рдВрдХреНрд╢рдВрд╕ рдЬреЛ рд╕реАрдПрдл рдХреЛ рдирд╣реАрдВ рдЫреВрддреЗ рд╣реИрдВ (рдЙрдирдореЗрдВ рд╕реЗ рдЕрдзрд┐рдХрд╛рдВрд╢) рдХреЛ рд╕реНрдерд┐рд░ рдЕрдкрд╡рд╛рдж рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдЕрд╡рд╕рд░ рдорд┐рд▓реЗрдЧрд╛ - рд╕рд╛рдорд╛рдиреНрдп рд░рд┐рдЯрд░реНрди рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдФрд░ рдЕрдкрд╡рд╛рдж рдлреЗрдВрдХрдиреЗ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ! рдЬрд┐рди рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╕рд╣реЗрдЬрдиреЗ рдФрд░ рдкреБрдирд░реНрд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЙрдиреНрд╣реЗрдВ рдиреНрдпреВрдирддрдо рдУрд╡рд░рд╣реЗрдб рдкреНрд░рд╛рдкреНрдд рд╣реЛрдЧрд╛, рдФрд░ рдпрд╣ рдЕрднреА рднреА std::expected рдФрд░ рдХрд┐рд╕реА рднреА рддреНрд░реБрдЯрд┐ рдХреЛрдб рд╕реЗ рдЕрдзрд┐рдХ рддреЗрдЬ рд╣реЛрдЧрд╛ред


рд╕реНрдереИрддрд┐рдХ рдЕрдкрд╡рд╛рдж рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддреЗ рд╣реИрдВ:


 int safe_divide(int i, int j) throws(arithmetic_errc) { if (j == 0) throw arithmetic_errc::divide_by_zero; if (i == INT_MIN && j == -1) throw arithmetic_errc::integer_divide_overflows; return i / j; } double foo(double i, double j, double k) throws(arithmetic_errc) { return i + safe_divide(j, k); } double bar(int i, double j, double k) { try { cout << foo(i, j, k); } catch (erithmetic_errc e) { cout << e; } } 

рд╡реИрдХрд▓реНрдкрд┐рдХ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ, try i + safe_divide(j, k) рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрд╕реА рдХреАрд╡рд░реНрдб рдореЗрдВ try рдХреАрд╡рд░реНрдб рдХреЛ рдЙрдкрдХреГрдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рд╣реИ: try i + safe_divide(j, k) ред рдЗрд╕рд╕реЗ рдХреЛрдб рдореЗрдВ throws рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдорд╛рдорд▓реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХрдо рд╣реЛ рдЬрд╛рдПрдЧреА рдЬреЛ рдЕрдкрд╡рд╛рджреЛрдВ рдХреЗ рд▓рд┐рдП рд▓рдЧрднрдЧ рд╢реВрдиреНрдп рдирд╣реАрдВ рд╣реИред рдХрд┐рд╕реА рднреА рдорд╛рдорд▓реЗ рдореЗрдВ, рдЧрддрд┐рд╢реАрд▓ рдЕрдкрд╡рд╛рджреЛрдВ рдХреЗ рд╡рд┐рдкрд░реАрдд, рдЖрдИрдбреАрдИ рдЕрдкрд╡рд╛рджреЛрдВ рдХреЛ рдлреЗрдВрдХрдиреЗ рд╡рд╛рд▓реЗ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХреЛ рдХрд┐рд╕реА рддрд░рд╣ рдЙрдЬрд╛рдЧрд░ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдЧрд╛ред


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


status_code


Niall рдбрдЧрд▓рд╕ рджреНрд╡рд╛рд░рд╛ рд╡рд┐рдХрд╕рд┐рдд <system_error2> рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ status_code<T> - "рдирдпрд╛, рдмреЗрд╣рддрд░" error_code ред error_code рд╕реЗ рдореБрдЦреНрдп рдЕрдВрддрд░:


  1. status_code - рдПрдХ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдкреНрд░рдХрд╛рд░ рдЬреЛ рд▓рдЧрднрдЧ рдХрд┐рд╕реА рднреА рдмреЛрдзрдЧрдореНрдп рддреНрд░реБрдЯрд┐ рдХреЛрдб рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (рд╕рд╛рде рдореЗрдВ status_code_category рд▓рд┐рдП рдПрдХ рдкреЙрдЗрдВрдЯрд░ рдХреЗ рд╕рд╛рде), рд╕реНрдерд┐рд░ рдЕрдкрд╡рд╛рдж рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдмрд┐рдирд╛ред
  2. T рдХреЛ рддреНрд░рд┐рд╡рд┐рдо рд░реВрдк рд╕реЗ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдФрд░ рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдпреЛрдЧреНрдп рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП (рдмрд╛рдж рд╡рд╛рд▓рд╛, рдЖрдИрдПрдордПрдЪрдУ, рдЕрдирд┐рд╡рд╛рд░реНрдп рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП)ред рдЬрдм рдХреЙрдкреА рдФрд░ рдбрд┐рд▓реАрдЯ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╡рд░реНрдЪреБрдЕрд▓ рдлрд╝рдВрдХреНрд╢рди рдХреЛ status_code_category рд╕реЗ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ
  3. status_code рди рдХреЗрд╡рд▓ рддреНрд░реБрдЯрд┐ рдбреЗрдЯрд╛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдмрд▓реНрдХрд┐ рдПрдХ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдкреВрд░реНрдг рдХрд┐рдП рдЧрдП рдСрдкрд░реЗрд╢рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрддрд┐рд░рд┐рдХреНрдд рдЬрд╛рдирдХрд╛рд░реА рднреА
  4. "рд╡рд░реНрдЪреБрдЕрд▓" рдлрд╝рдВрдХреНрд╢рди code.message() std::string рдирд╣реАрдВ string_ref рд╣реИ, рд▓реЗрдХрд┐рди string_ref рдПрдХ рдЕрдзрд┐рдХ рднрд╛рд░реА рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╣реИ, рдЬреЛ рдПрдХ рд╡рд░реНрдЪреБрдЕрд▓ "рд╕рдВрднрд╡рддрдГ рдорд╛рд▓рд┐рдХ" std::string_view ред рд╡рд╣рд╛рдВ рдЖрдк string_view рдпрд╛ string , рдпрд╛ std::shared_ptr<string> string_view std::shared_ptr<string> , рдпрд╛ рдХрд┐рд╕реА рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рдорд╛рд▓рд┐рдХ рдХрд╛ рдХреЛрдИ рдЕрдиреНрдп рдкрд╛рдЧрд▓ рддрд░реАрдХрд╛ рднрд░ рд╕рдХрддреЗ рд╣реИрдВред Niall рдХрд╛ рджрд╛рд╡рд╛ рд╣реИ рдХрд┐ #include <string> рд╣реЗрдбрд░ рдмрдирд╛ рджреЗрдЧрд╛ <system_error2> рдЕрд╕реНрд╡реАрдХрд╛рд░реНрдп рд░реВрдк рд╕реЗ "рднрд╛рд░реА"

рдЕрдЧрд▓рд╛, errored_status_code<T> рджрд░реНрдЬ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ - рдирд┐рдореНрди рдирд┐рд░реНрдорд╛рдгрдХрд░реНрддрд╛ рдХреЗ рд╕рд╛рде status_code<T> рдкрд░ рдПрдХ рдЖрд╡рд░рдг:


 errored_status_code(status_code<T>&& code) [[expects: code.failure() == true]] : code_(std::move(code)) {} 

рддреНрд░реБрдЯрд┐


рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдЕрдкрд╡рд╛рдж рдкреНрд░рдХрд╛рд░ (рдмрд┐рдирд╛ рдкреНрд░рдХрд╛рд░ рдХреЗ throws ), рд╕рд╛рде рд╣реА рдореВрд▓ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЕрдкрд╡рд╛рдж рдЬрд┐рдирдореЗрдВ рдЕрдиреНрдп рд╕рднреА рдХреЛ рдбрд╛рд▓рд╛ рдЬрд╛рддрд╛ рд╣реИ (рдЬреИрд╕реЗ std::exception ), error ред рдЗрд╕реЗ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:


 using error = errored_status_code<intptr_t>; 

рдпрд╣реА рд╣реИ, error рдПрдХ рдРрд╕реА "рддреНрд░реБрдЯрд┐" status_code , рдЬрд┐рд╕рдореЗрдВ рдорд╛рди ( value ) 1 рдкреЙрдЗрдВрдЯрд░ рдореЗрдВ рд░рдЦрд╛ рдЧрдпрд╛ рд╣реИред рдЪреВрдВрдХрд┐ status_code_category рддрдВрддреНрд░ рд╕рд╣реА рд╡рд┐рд▓реЛрдкрди, рдЧрддрд┐ рдФрд░ рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдмрдирд╛рдирд╛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддрд╛ рд╣реИ, рд╕реИрджреНрдзрд╛рдВрддрд┐рдХ рд░реВрдк рд╕реЗ, рдХрд┐рд╕реА рднреА рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛ рдХреЛ error рдореЗрдВ рдмрдЪрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ, рдпрд╣ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╡рд┐рдХрд▓реНрдкреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реЛрдЧрд╛:


  1. рдкреВрд░реНрдгрд╛рдВрдХ (int)
  2. std::exception_handle , рдЕрд░реНрдерд╛рддреН рдПрдХ рдлреЗрдВрдХрд╛ рд╣реБрдЖ рдЧрддрд┐рд╢реАрд▓ рдЕрдкрд╡рд╛рдж рдХрд╛ рд╕реВрдЪрдХ
  3. status_code_ptr , рдЕрд░реНрдерд╛рдд unique_ptr рдПрдХ рдордирдорд╛рдирд╛ status_code<T> ред

рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рд╕реНрдерд┐рддрд┐ 3 рдХреЛ status_code<T> error рд╡рд╛рдкрд╕ рд▓рд╛рдиреЗ рдХрд╛ рдЕрд╡рд╕рд░ рджреЗрдиреЗ рдХреА рдпреЛрдЬрдирд╛ рдирд╣реАрдВ рд╣реИред рдХреЗрд╡рд▓ рдПрдХ рдЪреАрдЬ рдЬреЛ рдЖрдк рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ message() рдкреИрдХреНрдб status_code<T> message() рдорд┐рд▓ рд╕рдХрддрд╛ рд╣реИред рд╡рд╛рдкрд╕ error рдореЗрдВ рд▓рд┐рдкрдЯреЗ рдореВрд▓реНрдп рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП, рдЗрд╕реЗ рдПрдХ рдЧрддрд┐рд╢реАрд▓ рдЕрдкрд╡рд╛рдж (!) рдХреЗ рд░реВрдк рдореЗрдВ рдлреЗрдВрдХ рджреЗрдВ, рдлрд┐рд░ рдЗрд╕реЗ error рдкрдХрдбрд╝реЗрдВ рдФрд░ рд▓рдкреЗрдЯреЗрдВред рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, Niall рдХрд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рдХреЗрд╡рд▓ рддреНрд░реБрдЯрд┐ рдХреЛрдб рдФрд░ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╕рдВрджреЗрд╢ error рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдП рдЬрд╛рдиреЗ рдЪрд╛рд╣рд┐рдП, рдЬреЛ рдХрд┐рд╕реА рднреА рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред


рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреА рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рдмреАрдЪ рдЕрдВрддрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, "рд╡рд░реНрдЪреБрдЕрд▓" рддреБрд▓рдирд╛ рдСрдкрд░реЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рд╣реИ:


 try { open_file(name); } catch (std::error e) { if (e == filesystem_error::already_exists) { return; } else { throw my_exception("Unknown filesystem error, unable to continue"); } } 

рдЕрдкрд╡рд╛рдж рдХреЗ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЪрдпрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдИ рдХреИрдЪ рдмреНрд▓реЙрдХ рдпрд╛ dynamic_cast рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╡рд┐рдлрд▓ рд╣реЛрдЧрд╛!


рдЧрддрд┐рд╢реАрд▓ рдЕрдкрд╡рд╛рджреЛрдВ рдХреЗ рд╕рд╛рде рд╕рд╣рднрд╛рдЧрд┐рддрд╛


рдПрдХ рд╕рдорд╛рд░реЛрд╣ рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╡рд┐рд╢рд┐рд╖реНрдЯрддрд╛рдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ:


  • noexcept : рдХреЛрдИ рдЕрдкрд╡рд╛рдж рдирд╣реАрдВ рдлреЗрдВрдХрддрд╛ рд╣реИ
  • throws(E) : рдХреЗрд╡рд▓ рд╕реНрдерд┐рд░ рдЕрдкрд╡рд╛рдж рдлреЗрдВрдХрддрд╛ рд╣реИ
  • (рдХреБрдЫ рдирд╣реАрдВ): рдХреЗрд╡рд▓ рдЧрддрд┐рд╢реАрд▓ рдЕрдкрд╡рд╛рдж рдлреЗрдВрдХрддрд╛ рд╣реИ

noexcept рдХрд╛ рддрд╛рддреНрдкрд░реНрдп noexcept рдпрджрд┐ рдПрдХ рдЧрддрд┐рд╢реАрд▓ рдЕрдкрд╡рд╛рдж рдХреЛ "рд╕реНрдерд┐рд░" рдлрд╝рдВрдХреНрд╢рди рд╕реЗ рдлреЗрдВрдХ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдпрд╣ error рдореЗрдВ рд▓рд┐рдкрдЯрд╛ рд╣реИред рдпрджрд┐ рдПрдХ рд╕реНрдерд┐рд░ рдЕрдкрд╡рд╛рдж рдХреЛ "рдЧрддрд┐рд╢реАрд▓" рдлрд╝рдВрдХреНрд╢рди рд╕реЗ рдлреЗрдВрдХ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдПрдХ status_error рдЕрдкрд╡рд╛рдж рдореЗрдВ рд▓рдкреЗрдЯрд╛ рдЬрд╛рддрд╛ рд╣реИред рдПрдХ рдЙрджрд╛рд╣рд░рдг:


 void foo() throws(arithmetic_errc) { throw erithmetic_errc::divide_by_zero; } void bar() throws { //  arithmetic_errc   intptr_t //     error foo(); } void baz() { // error    status_error bar(); } void qux() throws { // error    status_error baz(); } 

C рдореЗрдВ рдЕрдкрд╡рд╛рдж !?


рдпрд╣ рдкреНрд░рд╕реНрддрд╛рд╡ рднрд╡рд┐рд╖реНрдп рдХреЗ рд╕реА рдорд╛рдирдХреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдпреЗ рдЕрдкрд╡рд╛рдж C ++ рд╕реНрдЯреИрдЯрд┐рдХ рдХреЗ рд╕рд╛рде ABI- рд╕рдВрдЧрдд рд╣реЛрдВрдЧреЗред std::expected<T, U> рд╕рдорд╛рди рд╕рдВрд░рдЪрдирд╛ std::expected<T, U> , рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рд╕реНрд╡рддрдВрддреНрд░ рд░реВрдк рд╕реЗ рдШреЛрд╖рд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╣реЙрд▓реИрдВрдбреНрд╕ рд╕реЗ рдЕрддрд┐рд░реЗрдХ рдХреЛ рд╣рдЯрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд╕рд┐рдВрдЯреИрдХреНрд╕ рдореЗрдВ (рд╕рд╛рджрдЧреА рдХреЗ рд▓рд┐рдП, рд╣рдо рдЗрд╕реЗ рдорд╛рди рд▓реЗрдВрдЧреЗ) рдХреАрд╡рд░реНрдб рд╡рд┐рдлрд▓ рд╣реЛрддреЗ рд╣реИрдВ, рдЕрд╕рдлрд▓ рд╣реЛрддреЗ рд╣реИрдВ, рдкрдХрдбрд╝рддреЗ рд╣реИрдВред


 int invert(int x) fails(float) { if (x != 0) return 1 / x; else return failure(2.0f); } struct expected_int_float { union { int value; float error; }; _Bool failed; }; void caller() { expected_int_float result = catch(invert(5)); if (result.failed) { print_error(result.error); return; } print_success(result.value); } 

рд╕рд╛рде рд╣реА, C ++ рдореЗрдВ, C рд╕реЗ fails рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ рднреА рд╕рдВрднрд╡ рд╣реЛрдЧрд╛, рдЙрдиреНрд╣реЗрдВ extern C рдмреНрд▓реЙрдХ рдореЗрдВ рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЗрд╕ рдкреНрд░рдХрд╛рд░, C ++ рдореЗрдВ рдЕрдкрд╡рд╛рджреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреАрд╡рд░реНрдб рдХреА рдПрдХ рдкреВрд░реА рдЖрдХрд╛рд╢рдЧрдВрдЧрд╛ рд╣реЛрдЧреА:


  • throw() - рд╕реА ++ 20 рдореЗрдВ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЧрдпрд╛
  • noexcept - рдлрд╝рдВрдХреНрд╢рди рд╡рд┐рдирд┐рд░реНрджреЗрд╢рдХ, рдлрд╝рдВрдХреНрд╢рди рдЧрддрд┐рд╢реАрд▓ рдЕрдкрд╡рд╛рджреЛрдВ рдХреЛ рдирд╣реАрдВ рдлреЗрдВрдХрддрд╛ рд╣реИ
  • noexcept(expression) - рдлрд╝рдВрдХреНрд╢рди рд╡рд┐рдирд┐рд░реНрджреЗрд╢рдХ, рдлрд╝рдВрдХреНрд╢рди рдкреНрд░рджрд╛рди рдХрд┐рдП рдЧрдП рдЧрддрд┐рд╢реАрд▓ рдЕрдкрд╡рд╛рджреЛрдВ рдХреЛ рдирд╣реАрдВ рдлреЗрдВрдХрддрд╛ рд╣реИ
  • noexcept(expression) - рдХреНрдпрд╛ рдХреЛрдИ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдЧрддрд┐рд╢реАрд▓ рдЕрдкрд╡рд╛рджреЛрдВ рдХреЛ noexcept(expression) рд╣реИ?
  • throws(E) - рдлрд╝рдВрдХреНрд╢рди рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддрд╛ рд╣реИ, рдлрд╝рдВрдХреНрд╢рди рд╕реНрдерд┐рд░ рдЕрдкрд╡рд╛рджреЛрдВ рдХреЛ рдлреЗрдВрдХрддрд╛ рд╣реИ
  • throws = throws(std::error)
  • fails(E) - рд╕реА рд╕реЗ рдЖрдпрд╛рддрд┐рдд рдПрдХ рд╕рдорд╛рд░реЛрд╣ рд╕реНрдереИрддрд┐рдХ рдЕрдкрд╡рд╛рдж рдлреЗрдВрдХрддрд╛ рд╣реИ

рдЗрд╕рд▓рд┐рдП, рд╕реА ++ рдореЗрдВ рд╡реЗ рддреНрд░реБрдЯрд┐ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреЗ рд▓рд┐рдП рдирдП рдЙрдкрдХрд░рдгреЛрдВ рдХреА рдПрдХ рдЧрд╛рдбрд╝реА (рдпрд╛ рдмрд▓реНрдХрд┐, рд╡рд┐рддрд░рд┐рдд) рд▓рд╛рдПред рдЕрдЧрд▓рд╛, рдПрдХ рддрд╛рд░реНрдХрд┐рдХ рд╕рд╡рд╛рд▓ рдЙрдарддрд╛ рд╣реИ:


рдХрдм рдХреНрдпрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИ?


рд╕рд╛рдорд╛рдиреНрдп рджрд┐рд╢рд╛


рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдХрдИ рд╕реНрддрд░реЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:


  • рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рддреНрд░реБрдЯрд┐рдпреЛрдВред рдЕрдиреБрдмрдВрдзреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рдВрд╕рд╛рдзрд┐рддред рд╡реЗ рд╡рд┐рдлрд▓-рдлрд╛рд╕реНрдЯ рдХреА рдЕрд╡рдзрд╛рд░рдгрд╛ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рд▓реЙрдЧ рдХреЗ рд╕рдВрдЧреНрд░рд╣ рдФрд░ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреА рд╕рдорд╛рдкреНрддрд┐ рдХрд╛ рдиреЗрддреГрддреНрд╡ рдХрд░рддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг: рдЕрд╢рдХреНрдд рд╕реВрдЪрдХ (рдЬрдм рдпрд╣ рдЕрдорд╛рдиреНрдп рд╣реИ); рд╢реВрдиреНрдп рд╕реЗ рд╡рд┐рднрд╛рдЬрди; рдореЗрдореЛрд░реА рдПрд▓реЛрдХреЗрд╢рди рдПрд░рд░ рдХреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдиреЗ рдирд╣реАрдВ рджреЗрдЦрд╛ред
  • рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд╛рди рдХреА рдЧрдИ рдШрд╛рддрдХ рддреНрд░реБрдЯрд┐рдпрд╛рдВред рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд╕реЗ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рд░рд┐рдЯрд░реНрди рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдПрдХ рд▓рд╛рдЦ рдЧреБрдирд╛ рдХрдо рдмрд╛рд░ рдлреЗрдВрдХреЛ, рдЬреЛ рдЧрддрд┐рд╢реАрд▓ рдЕрдкрд╡рд╛рджреЛрдВ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЛ рдЙрдирдХреЗ рд▓рд┐рдП рдЙрдЪрд┐рдд рдмрдирд╛рддрд╛ рд╣реИред рдЖрдорддреМрд░ рдкрд░, рдРрд╕реЗ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдЖрдкрдХреЛ рдСрдкрд░реЗрд╢рди рдХрд░рддреЗ рд╕рдордп рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЗ рдкреВрд░реЗ рд╕рдмрд╕рд┐рд╕реНрдЯрдо рдХреЛ рдкреБрдирдГ рдЖрд░рдВрдн рдХрд░рдиреЗ рдпрд╛ рддреНрд░реБрдЯрд┐ рджреЗрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдЙрджрд╛рд╣рд░рдг: рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ рдЕрдЪрд╛рдирдХ рдЦреЛрдпрд╛ рд╣реБрдЖ рд╕рдВрдмрдВрдз; рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд╛рди рдХреА рдЧрдИ рдореЗрдореЛрд░реА рдПрд▓реЛрдХреЗрд╢рди рдПрд░рд░ред
  • рдкреБрдирд░реНрдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдпреЛрдЧреНрдп рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдЬрдм рдлрд╝рдВрдХреНрд╢рди рдиреЗ рдЕрдкрдиреЗ рдХрд╛рд░реНрдп рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рд╕реЗ рд░реЛрдХрд╛, рд▓реЗрдХрд┐рди рдХреЙрд▓рд┐рдВрдЧ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдкрддрд╛ рдЪрд▓ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕рдХреЗ рд╕рд╛рде рдХреНрдпрд╛ рдХрд░рдирд╛ рд╣реИред рд╕реНрдерд┐рд░ рдЕрдкрд╡рд╛рджреЛрдВ рджреНрд╡рд╛рд░рд╛ рдирд┐рдпрдВрддреНрд░рд┐рддред рдЙрджрд╛рд╣рд░рдг: рдлрд╝рд╛рдЗрд▓ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛; рдЕрдиреНрдп рдЗрдирдкреБрдЯ / рдЖрдЙрдЯрдкреБрдЯ (IO) рддреНрд░реБрдЯрд┐рдпрд╛рдВ; рдЧрд▓рдд рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдбреЗрдЯрд╛ vector::at() ред
  • рдПрдХ рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рдкрд░рд┐рдгрд╛рдо рдХреЗ рд╕рд╛рде, рдлрд╝рдВрдХреНрд╢рди рдиреЗ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдЕрдкрдирд╛ рдХрд╛рдо рдкреВрд░рд╛ рдХрд┐рдпрд╛ред std::optional , std::expected , std::variant ред рдЙрджрд╛рд╣рд░рдг: stoi() ; vector::find() ; map::insert ред

рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ, "рдЕрдкрд╡рд╛рджреЛрдВ рдХреЗ рдмрд┐рдирд╛" рдХрд╛рдиреВрдиреА рд░реВрдк рд╕реЗ рд╕рдВрдХрд▓рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЧрддрд┐рд╢реАрд▓ рдЕрдкрд╡рд╛рджреЛрдВ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЫреЛрдбрд╝рдирд╛ рд╕рдмрд╕реЗ рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рд╣реИред


errno


C рдФрд░ C ++ рддреНрд░реБрдЯрд┐ рдХреЛрдб рдХреЗ рд╕рд╛рде рдЬрд▓реНрджреА рдФрд░ рдЖрд╕рд╛рдиреА рд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП errno рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдХреНрд░рдорд╢рдГ fails(int) рдФрд░ throws(std::errc) рд╕рд╛рде рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдХреБрдЫ рд╕рдордп рдХреЗ рд▓рд┐рдП, рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдкреБрд░рд╛рдиреЗ рдФрд░ рдирдП рд╕рдВрд╕реНрдХрд░рдг рд╕рд╣-рдЕрд╕реНрддрд┐рддреНрд╡ рдореЗрдВ рдЖрдПрдВрдЧреЗ, рдлрд┐рд░ рдкреБрд░рд╛рдиреЗ рдХреЛ рдЕрдкреНрд░рдЪрд▓рд┐рдд рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред


рд╕реНрдореГрддрд┐ рд╕реЗ рдмрд╛рд╣рд░


рдореЗрдореЛрд░реА рдЖрд╡рдВрдЯрди рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ new_handler рдЧреНрд▓реЛрдмрд▓ рд╣реБрдХ рджреНрд╡рд╛рд░рд╛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:


  1. рд╕реНрдореГрддрд┐ рдХреА рдХрдореА рдХреЛ рджреВрд░ рдХрд░реЗрдВ рдФрд░ рдирд┐рд╖реНрдкрд╛рджрди рдЬрд╛рд░реА рд░рдЦреЗрдВ
  2. рдПрдХ рдЕрдкрд╡рд╛рдж рдлреЗрдВрдХ рджреЗрдВ
  3. рдХреНрд░реИрд╢ рдкреНрд░реЛрдЧреНрд░рд╛рдо

рдЕрдм std::bad_alloc рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк std::bad_alloc рдлреЗрдВрдХ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ std::terminate() рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХрд╛ рд╕реБрдЭрд╛рд╡ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдпрджрд┐ рдЖрдкрдХреЛ рдкреБрд░рд╛рдиреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рд╣реИрдВрдбрд▓рд░ рдХреЛ main() рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рдЖрдкрдХреА рдЬрд╝рд░реВрд░рдд рдХреЗ рд╕рд╛рде рдмрджрд▓реЗрдВред


рдорд╛рдирдХ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рд╕рднреА рдореМрдЬреВрджрд╛ рдХрд╛рд░реНрдп noexcept рд╣реЛ noexcept рдФрд░ рдЬрдм std::bad_alloc рд╣реЛрдЧрд╛ рддреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ рдХреНрд░реИрд╢ рдХрд░ рджреЗрдЧрд╛ред рдЙрд╕реА рд╕рдордп, vector::try_push_back рдЬреИрд╕реЗ рдирдП рдПрдкреАрдЖрдИ vector::try_push_back рдЬреЛрдбрд╝реЗ рдЬрд╛рдПрдВрдЧреЗ, рдЬреЛ рдореЗрдореЛрд░реА рдЖрд╡рдВрдЯрди рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВред


logic_error


рдЕрдкрд╡рд╛рдж std::logic_error , std::logic_error , std::domain_error , std::invalid_argument std::length_error , std::out_of_range , std::future_error рдХрд┐рд╕реА рдлрд╝рдВрдХреНрд╢рди рдкреВрд░реНрд╡ рд╢рд░реНрдд рдХреЗ рдЙрд▓реНрд▓рдВрдШрди рдХреА рд░рд┐рдкреЛрд░реНрдЯ рдХрд░рддреЗ рд╣реИрдВред рдирдП рддреНрд░реБрдЯрд┐ рдореЙрдбрд▓ рдХреЗ рдмрдЬрд╛рдп рдЕрдиреБрдмрдВрдз рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рд╕реВрдЪреАрдмрджреНрдз рдкреНрд░рдХрд╛рд░ рдХреЗ рдЕрдкрд╡рд╛рджреЛрдВ рдХреЛ рдкрджрд╛рд╡рдирдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рд▓реЗрдХрд┐рди рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ рдЙрдирдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рдЧрднрдЧ рд╕рднреА рдорд╛рдорд▓реЛрдВ рдХреЛ [[expects: тАж]] рджреНрд╡рд╛рд░рд╛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред


рд╡рд░реНрддрдорд╛рди рдкреНрд░рд╕реНрддрд╛рд╡ рд╕реНрдерд┐рддрд┐


рдкреНрд░рд╕реНрддрд╛рд╡ рдЕрдм рдПрдХ рдорд╕реМрджрд╛ рд░рд╛рдЬреНрдп рдореЗрдВ рд╣реИред рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХрд╛рдлреА рдмрджрд▓ рдЧрдпрд╛ рд╣реИ, рдФрд░ рдЕрднреА рднреА рдмрд╣реБрдд рдХреБрдЫ рдмрджрд▓ рд╕рдХрддрд╛ рд╣реИред рдХреБрдЫ рдШрдЯрдирд╛рдХреНрд░рдо рдкреНрд░рдХрд╛рд╢рд┐рдд рд╣реЛрдиреЗ рдХрд╛ рдкреНрд░рдмрдВрдзрди рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд API <system_error2> рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рдирд╣реАрдВ рд╣реИред


рдкреНрд░рд╕реНрддрд╛рд╡ 3 рджрд╕реНрддрд╛рд╡реЗрдЬреЛрдВ рдореЗрдВ рд╡рд░реНрдгрд┐рдд рд╣реИ:


  1. P709 - рд╕рдЯрд░ рдХреЗ рд╣рдерд┐рдпрд╛рд░реЛрдВ рдХреЗ рдХреЛрдЯ рд╕реЗ рдореВрд▓ рджрд╕реНрддрд╛рд╡реЗрдЬ
  2. P1095 - рдирд┐рдпрд╛рд▓ рдбрдЧрд▓рд╕ рд╡рд┐рдЬрд╝рди рдореЗрдВ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдЕрдкрд╡рд╛рдж, рдХреБрдЫ рдХреНрд╖рдгреЛрдВ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди , рд╕реА рднрд╛рд╖рд╛ рдХреА рд╕рдВрдЧрддрддрд╛
  3. P1028 - std::error рдХреЗ рдкрд░реАрдХреНрд╖рдг рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╕реЗ рдПрдкреАрдЖрдИ

рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдХреЛрдИ рд╕рдВрдХрд▓рдХ рдирд╣реАрдВ рд╣реИ рдЬреЛ рд╕реНрдереИрддрд┐рдХ рдЕрдкрд╡рд╛рджреЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИред рддрджрдиреБрд╕рд╛рд░, рдЕрднреА рддрдХ рдЙрдирдХреЗ рдмреЗрдВрдЪрдорд╛рд░реНрдХ рдмрдирд╛рдирд╛ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИред


C++23. , , , C++26, , , .


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


, , . , . .


, ^^

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


All Articles