рдпрд╣ рдЕрдЬреАрдм рдмрд╛рдд рд╣реИ рдХрд┐ рд╣рдмреНрд░рдд рдкрд░ рдЕрднреА рддрдХ 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;
рдпрджрд┐ рддреНрд░реБрдЯрд┐ рдХрд╛ рдХрд╛рд░рдг рд╣рдорд╛рд░реЗ рд▓рд┐рдП рджрд┐рд▓рдЪрд╕реНрдк рдирд╣реАрдВ рд╣реИ, рдпрд╛ рддреНрд░реБрдЯрд┐ рдХреЗрд╡рд▓ рдкрд░рд┐рдгрд╛рдо рдХреА "рдЕрдиреБрдкрд╕реНрдерд┐рддрд┐" рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реЛ рд╕рдХрддреА рд╣реИ, рддреЛ 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 ++ рдореЗрдВ рдЬреЛрдбрд╝рдиреЗ рдХреА рдкреЗрд╢рдХрд╢ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдУрд╡рд░рд╣реЗрдб рд╕рдорд╕реНрдпрд╛ рд╣рд▓ рд╣реЛ рдЬрд╛рдПрдЧреАред
рдпрджрд┐ рджреЛ рдСрдкрд░реЗрд╢рди: рдкреБрд░рд╛рдиреА рд╡рд╕реНрддреБ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдирд╛ рдФрд░ рд╣рдЯрд╛рдирд╛ рдкреБрд░рд╛рдиреА рд╡рд╕реНрддреБ рд╕реЗ рдирдП рдХреЗ рд▓рд┐рдП рдпрд╛рджрдЧрд╛рд░ рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИ, рддреЛ рдПрдХ рд╡рд░реНрдЧ рдХреЛ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред рдкреБрд░рд╛рдиреА рд╡рд╕реНрддреБ рдХреЛ рд╣рдЯрд╛рдпрд╛ рдирд╣реАрдВ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдЦрдХ рдЗрд╕реЗ "рдлрд░реНрд╢ рдкрд░ рдЫреЛрдбрд╝рдирд╛" рдХрд╣рддреЗ рд╣реИрдВред
рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкреНрд░рдХрд╛рд░ рдХреА рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╕рд╣реА рд╣реЛрдиреЗ рдкрд░ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рддреНрд░реИрдорд╛рд╕рд┐рдХ рдмрд┐рдВрджреБ рд╕реЗ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рддреНрд░реИрдорд╛рд╕рд┐рдХ рд╕рдВрдмрдВрдз рд╣реИ:
- рдпрд╣ рддреБрдЪреНрдЫ рд░реВрдк рд╕реЗ рдЬрдВрдЧрдо + рддреБрдЪреНрдЫ рд╡рд┐рдирд╛рд╢рдХрд╛рд░реА рд╣реИ (рдЙрджрд╛рд╣рд░рдг
int
рдпрд╛ POD рд╕рдВрд░рдЪрдирд╛) - рдпрд╣
[[trivially_relocatable]]
рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рд╕рд╛рде рдЪрд┐рд╣реНрдирд┐рдд рд╡рд░реНрдЧ рд╣реИ [[trivially_relocatable]]
- рдпрд╣ рдПрдХ рдРрд╕рд╛ рд╡рд░реНрдЧ рд╣реИ рдЬрд┐рд╕рдХреЗ рд╕рднреА рд╕рджрд╕реНрдп рддреНрд░реИрдорд╛рд╕рд┐рдХ рд░реВрдк рд╕реЗ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рд╣реЛрддреЗ рд╣реИрдВред
рдЖрдк рдЗрд╕ рдЬрд╛рдирдХрд╛рд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ std::uninitialized_relocate
рд╕рд╛рде рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рд╕рд╛рдорд╛рдиреНрдп рддрд░реАрдХреЗ рд╕реЗ рдореВрд╡ рдЗрдирд┐рдЯ + рдбрд┐рд▓реАрдЯ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддрд╛ рд╣реИ, рдпрд╛ рдпрджрд┐ рд╕рдВрднрд╡ рд╣реЛ рддреЛ рддреНрд╡рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ [[trivially_relocatable]]
рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рдЕрдзрд┐рдХрд╛рдВрд╢ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░рдиреЗ рдХрд╛ рд╕реБрдЭрд╛рд╡ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ std::string
, std::vector
, std::unique_ptr
ред рдУрд╡рд░рд╣реЗрдб std::vector<std::unique_ptr<T>>
рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддреЗ рд╣реБрдП рдкреНрд░рд╕реНрддрд╛рд╡ рдЧрд╛рдпрдм рд╣реЛ рдЬрд╛рдПрдЧрд╛ред
рдЕрдм рдЕрдкрд╡рд╛рджреЛрдВ рдореЗрдВ рдХреНрдпрд╛ рдЧрд▓рдд рд╣реИ?
рд╕реА ++ рдЕрдкрд╡рд╛рдж рддрдВрддреНрд░ 1992 рдореЗрдВ рд╡рд┐рдХрд╕рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рд╡рд┐рднрд┐рдиреНрди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╡рд┐рдХрд▓реНрдк рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдХрд┐рдП рдЧрдП рд╣реИрдВред рдЗрдирдореЗрдВ рд╕реЗ, рдПрдХ рдЕрдкрд╡рд╛рдж рддрд╛рд▓рд┐рдХрд╛ рддрдВрддреНрд░ рдХрд╛ рдЪрдпрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдЬреЛ рдХрд╛рд░реНрдпрдХреНрд░рдо рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рдореБрдЦреНрдп рдкрде рдХреЗ рд▓рд┐рдП рдУрд╡рд░рд╣реЗрдб рдХреА рдЕрдиреБрдкрд╕реНрдерд┐рддрд┐ рдХреА рдЧрд╛рд░рдВрдЯреА рджреЗрддрд╛ рд╣реИред рдХреНрдпреЛрдВрдХрд┐ рдЙрдирдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рдЙрд╕реА рдХреНрд╖рдг рд╕реЗ, рдпрд╣ рдорд╛рди рд▓рд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдХрд┐ рдЕрдкрд╡рд╛рджреЛрдВ рдХреЛ рдмрд╣реБрдд рдХрдо рд╣реА рдлреЗрдВрдХрдирд╛ рдЪрд╛рд╣рд┐рдП ред
рдЧрддрд┐рд╢реАрд▓ рдХреЗ рдиреБрдХрд╕рд╛рди (рдпрд╛рдиреА рдирд┐рдпрдорд┐рдд) рдЕрдкрд╡рд╛рдж:
- рдлреЗрдВрдХреЗ рдЧрдП рдЕрдкрд╡рд╛рдж рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдУрд╡рд░рд╣реЗрдб рдФрд╕рддрди 10,000-100,000 рд╕реАрдкреАрдпреВ рдЪрдХреНрд░реЛрдВ рдкрд░ рд╣реЛрддрд╛ рд╣реИ, рдФрд░ рд╕рдмрд╕реЗ рдЦрд░рд╛рдм рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдпрд╣ рдорд┐рд▓реАрд╕реЗрдХрдВрдб рдХреЗ рдХреНрд░рдо рддрдХ рдкрд╣реБрдВрдЪ рд╕рдХрддрд╛ рд╣реИ
- рдмрд╛рдЗрдирд░реА рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдЖрдХрд╛рд░ 15-38% рдмрдврд╝рд╛
- C рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рд╕рд╛рде рдЕрд╕рдВрдЧрддрд┐
noexcept
рдХреЛ рдЫреЛрдбрд╝рдХрд░ рд╕рднреА рдлрдВрдХреНрд╢рдиреНрд╕ рдореЗрдВ noexcept
рдЕрдкрд╡рд╛рдж рдереНрд░реЛ рд╕рдкреЛрд░реНрдЯред рдПрдХ рдЕрдкрд╡рд╛рдж рдХрд╛рд░реНрдпрдХреНрд░рдо рдореЗрдВ рд▓рдЧрднрдЧ рдХрд╣реАрдВ рднреА рдлреЗрдВрдХрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЬрд╣рд╛рдВ рдлрд╝рдВрдХреНрд╢рди рд▓реЗрдЦрдХ рдХреЛ рдЗрд╕рдХреА рдЙрдореНрдореАрдж рдирд╣реАрдВ рд╣реИ
рдЗрди рдХрдорд┐рдпреЛрдВ рдХреЗ рдХрд╛рд░рдг, рдЕрдкрд╡рд╛рджреЛрдВ рдХрд╛ рджрд╛рдпрд░рд╛ рдХрд╛рдлреА рд╕реАрдорд┐рдд рд╣реИред рдЬрдм рдЕрдкрд╡рд╛рдж рд▓рд╛рдЧреВ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреЗ:
- рдЬрд╣рд╛рдВ рдирд┐рдпрддрддреНрд╡рд╡рд╛рдж рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ, рдЕрд░реНрдерд╛рддреН рдЬрд╣рд╛рдВ рдпрд╣ рдЕрд╕реНрд╡реАрдХрд╛рд░реНрдп рд╣реИ рдХрд┐ рдХреЛрдб "рдХрднреА-рдХрднреА" 10, 100, 1000 рдЧреБрдирд╛ рд╕рд╛рдорд╛рдиреНрдп рд╕реЗ рдЕрдзрд┐рдХ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ
- рдЬрдм рд╡реЗ рдПрдмреАрдЖрдИ рдореЗрдВ рд╕рдорд░реНрдерд┐рдд рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдорд╛рдЗрдХреНрд░реЛрдХрдВрдЯреНрд░реЛрд▓рд░ рдореЗрдВ
- рдЬрдм рдХреЛрдб рдХрд╛ рдПрдХ рдмрдбрд╝рд╛ рд╣рд┐рд╕реНрд╕рд╛ C рдореЗрдВ рд▓рд┐рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ
- рд╡рд┐рд░рд╛рд╕рдд рдХреЛрдб ( Google рд╢реИрд▓реА рдЧрд╛рдЗрдб , Qt ) рдХреЗ рдПрдХ рдмрдбрд╝реЗ рднрд╛рд░ рд╡рд╛рд▓реА рдХрдВрдкрдирд┐рдпреЛрдВ рдореЗрдВред рдпрджрд┐ рдХреЛрдб рдореЗрдВ рдХрдо рд╕реЗ рдХрдо рдПрдХ рдЧреИрд░-рдЕрдкрд╡рд╛рдж-рд╕реБрд░рдХреНрд╖рд┐рдд рдлрд╝рдВрдХреНрд╢рди рд╣реИ, рддреЛ рдореАрдирд┐рдВрдЧ рдСрдл рд▓реЙ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдпрд╛ рдмрд╛рдж рдореЗрдВ рдЗрд╕рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдПрдХ рдЕрдкрд╡рд╛рдж рдлреЗрдВрдХ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдФрд░ рдПрдХ рдмрдЧ рдмрдирд╛рдПрдВ
- рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЛ рдХрд╛рдо рдкрд░ рд░рдЦрдиреЗ рд╡рд╛рд▓реА рдХрдВрдкрдирд┐рдпреЛрдВ рдореЗрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдЕрдкрд╡рд╛рдж рд╕реБрд░рдХреНрд╖рд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреЛрдИ рдЬрд╛рдирдХрд╛рд░реА рдирд╣реАрдВ рд╣реИ
рд╕рд░реНрд╡реЗрдХреНрд╖рдгреЛрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░, 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
рд╕реЗ рдореБрдЦреНрдп рдЕрдВрддрд░:
status_code
- рдПрдХ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдкреНрд░рдХрд╛рд░ рдЬреЛ рд▓рдЧрднрдЧ рдХрд┐рд╕реА рднреА рдмреЛрдзрдЧрдореНрдп рддреНрд░реБрдЯрд┐ рдХреЛрдб рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (рд╕рд╛рде рдореЗрдВ status_code_category
рд▓рд┐рдП рдПрдХ рдкреЙрдЗрдВрдЯрд░ рдХреЗ рд╕рд╛рде), рд╕реНрдерд┐рд░ рдЕрдкрд╡рд╛рдж рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдмрд┐рдирд╛редT
рдХреЛ рддреНрд░рд┐рд╡рд┐рдо рд░реВрдк рд╕реЗ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдФрд░ рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдпреЛрдЧреНрдп рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП (рдмрд╛рдж рд╡рд╛рд▓рд╛, рдЖрдИрдПрдордПрдЪрдУ, рдЕрдирд┐рд╡рд╛рд░реНрдп рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП)ред рдЬрдм рдХреЙрдкреА рдФрд░ рдбрд┐рд▓реАрдЯ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╡рд░реНрдЪреБрдЕрд▓ рдлрд╝рдВрдХреНрд╢рди рдХреЛ status_code_category
рд╕реЗ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИstatus_code
рди рдХреЗрд╡рд▓ рддреНрд░реБрдЯрд┐ рдбреЗрдЯрд╛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдмрд▓реНрдХрд┐ рдПрдХ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдкреВрд░реНрдг рдХрд┐рдП рдЧрдП рдСрдкрд░реЗрд╢рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрддрд┐рд░рд┐рдХреНрдд рдЬрд╛рдирдХрд╛рд░реА рднреА- "рд╡рд░реНрдЪреБрдЕрд▓" рдлрд╝рдВрдХреНрд╢рди
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
рдореЗрдВ рдмрдЪрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ, рдпрд╣ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╡рд┐рдХрд▓реНрдкреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реЛрдЧрд╛:
- рдкреВрд░реНрдгрд╛рдВрдХ (int)
std::exception_handle
, рдЕрд░реНрдерд╛рддреН рдПрдХ рдлреЗрдВрдХрд╛ рд╣реБрдЖ рдЧрддрд┐рд╢реАрд▓ рдЕрдкрд╡рд╛рдж рдХрд╛ рд╕реВрдЪрдХ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 {
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
рдЧреНрд▓реЛрдмрд▓ рд╣реБрдХ рджреНрд╡рд╛рд░рд╛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
- рд╕реНрдореГрддрд┐ рдХреА рдХрдореА рдХреЛ рджреВрд░ рдХрд░реЗрдВ рдФрд░ рдирд┐рд╖реНрдкрд╛рджрди рдЬрд╛рд░реА рд░рдЦреЗрдВ
- рдПрдХ рдЕрдкрд╡рд╛рдж рдлреЗрдВрдХ рджреЗрдВ
- рдХреНрд░реИрд╢ рдкреНрд░реЛрдЧреНрд░рд╛рдо
рдЕрдм 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 рджрд╕реНрддрд╛рд╡реЗрдЬреЛрдВ рдореЗрдВ рд╡рд░реНрдгрд┐рдд рд╣реИ:
- P709 - рд╕рдЯрд░ рдХреЗ рд╣рдерд┐рдпрд╛рд░реЛрдВ рдХреЗ рдХреЛрдЯ рд╕реЗ рдореВрд▓ рджрд╕реНрддрд╛рд╡реЗрдЬ
- P1095 - рдирд┐рдпрд╛рд▓ рдбрдЧрд▓рд╕ рд╡рд┐рдЬрд╝рди рдореЗрдВ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдЕрдкрд╡рд╛рдж, рдХреБрдЫ рдХреНрд╖рдгреЛрдВ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди , рд╕реА рднрд╛рд╖рд╛ рдХреА рд╕рдВрдЧрддрддрд╛
- P1028 -
std::error
рдХреЗ рдкрд░реАрдХреНрд╖рдг рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╕реЗ рдПрдкреАрдЖрдИ
рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдХреЛрдИ рд╕рдВрдХрд▓рдХ рдирд╣реАрдВ рд╣реИ рдЬреЛ рд╕реНрдереИрддрд┐рдХ рдЕрдкрд╡рд╛рджреЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИред рддрджрдиреБрд╕рд╛рд░, рдЕрднреА рддрдХ рдЙрдирдХреЗ рдмреЗрдВрдЪрдорд╛рд░реНрдХ рдмрдирд╛рдирд╛ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИред
C++23. , , , C++26, , , .
рдирд┐рд╖реНрдХрд░реНрд╖
, , . , . .
, ^^