Habrtã§ã¯ãããŒããªãŒããŒãããã®æ±ºå®è«çäŸå€ããšåŒã°ããC ++æšæºã®é
åçãªææ¡ã«ã€ããŠèšåãããŠããªãã®ã¯å¥åŠã§ãã ãã®è¿·æãªçç¥ãä¿®æ£ããŸãã
äŸå€ã®ãªãŒããŒããããå¿é
ãªå ŽåããŸãã¯äŸå€ãµããŒããªãã§ã³ãŒããã³ã³ãã€ã«ããå¿
èŠãããå ŽåããŸãã¯C ++ 2bã®ãšã©ãŒåŠçïŒ æè¿ã®æçš¿ãžã®åç
§ïŒã§äœãèµ·ããã®ãçåã«æã£ãŠããå Žåã¯ãcatã«åãåãããŠãã ããã ããªãã¯ä»ãããã¯ã§èŠã€ããããšãã§ãããã¹ãŠã®ãã®ã®çµãåºããšãããã€ãã®äžè«èª¿æ»ãåŸ
ã£ãŠããŸãã
以äžã®èª¬æã¯ãéçãªäŸå€ã ãã§ãªããæšæºã«é¢é£ããææ¡ãããã³ãã®ä»ã®ããããçš®é¡ã®ãšã©ãŒåŠçæ¹æ³ã«ã€ããŠãè¡ãããŸãã æ§æãèŠãããã«ããã«è¡ã£ãå Žåã¯ã次ã®ãšããã§ãã
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
and catch (std::error e)
ã ãthrows
䜿çšã§ããŸãã
ç¥ã£ãŠãããã
std::optional
ããã³std::expected
é¢æ°ã§çºçããå¯èœæ§ã®ãããšã©ãŒã¯ãäŸå€ãã¹ããŒããã»ã©èŽåœçã§ã¯ãªããšå€æããŸãããã åŸæ¥ããšã©ãŒæ
å ±ã¯outãã©ã¡ãŒã¿ãŒã䜿çšããŠè¿ãããŸãã ããšãã°ã Filesystem TSã¯åæ§ã®æ©èœãå€æ°æäŸããŠããŸãã
uintmax_t file_size(const path& p, error_code& ec);
ïŒãã¡ã€ã«ãèŠã€ãããªãã£ããããäŸå€ãã¹ããŒããŸãããïŒïŒãã ãããšã©ãŒã³ãŒãã®åŠçã¯ç
©éã§ãã°ãçºçããããã§ãã ãšã©ãŒã³ãŒãã¯ç¢ºèªããã®ãå¿ããã¡ã§ãã ææ°ã®ã³ãŒãã¹ã¿ã€ã«ã§ã¯ãåºåãã©ã¡ãŒã¿ãŒã®äœ¿çšãçŠæ¢ãããŠãããããçµæå
šäœãå«ãæ§é äœãè¿ãããšããå§ãããŸãã
ãã°ããã®éãBoostã¯ããã®ãããªãèŽåœçã§ãªãããšã©ãŒãåŠçãããšã¬ã¬ã³ããªãœãªã¥ãŒã·ã§ã³ãæäŸããŠããŸãããç¹å®ã®ã·ããªãªã§ã¯ãæ£ããããã°ã©ã ã§äœçŸäººãçºçããå¯èœæ§ããããŸãã
expected<uintmax_t, error_code> file_size(const path& p);
expected
ã¿ã€ãã¯variant
ãšäŒŒãŠããŸããããresultããšãerrorããæäœããããã®äŸ¿å©ãªã€ã³ã¿ãŒãã§ãŒã¹ãæäŸããŸãã ããã©ã«ãã§ã¯ã expected
çµæã¯expected
ä¿åãexpected
ãŸãã file_size
å®è£
ã¯æ¬¡ã®ããã«ãªããŸãã
file_info* info = read_file_info(p); if (info != null) { uintmax_t size = info->size; return size;
ãšã©ãŒã®åå ãç§ãã¡ã«ãšã£ãŠèå³ã®ãªããã®ã§ããå ŽåããŸãã¯ãšã©ãŒãçµæã®ãäžåšãã®ã¿ã§æ§æãããoptional
ã¯ã optional
ã䜿çšã§ããŸãã
optional<int> parse_int(const std::string& s); optional<U> get_or_null(map<T, U> m, const T& key);
Boostã®C ++ 17ã§ã¯ã optionalãstdã«è¿œå ãããŸããïŒ optional<T&>
ãµããŒããªãïŒã C ++ 20ã§ã¯ã æåŸ
ã©ããã«è¿œå ãããå ŽåããããŸãïŒããã¯åãªãææ¡ã§ããã RamzesXIã®ä¿®æ£ã«æè¬ããŸãïŒã
å¥çŽ
ã³ã³ãã©ã¯ã ïŒæŠå¿µãšæ··åããªãã§ãã ããïŒã¯ãé¢æ°ãã©ã¡ãŒã¿ãŒã«å¶éã課ãæ°ããæ¹æ³ã§ãããC ++ 20ã§è¿œå ãããŸããã è¿œå ããã3ã€ã®æ³šéïŒ
- é¢æ°ã®ãã©ã¡ãŒã¿ãŒããã§ãã¯ããŸã
- é¢æ°ã®æ»ãå€ã確èªããŸãïŒåŒæ°ãšããŠåãåããŸãïŒ
- assert -assertãã¯ãã®ææçãªçœ®ãæã
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ã¯ã int
åã®ãšã©ãŒã³ãŒããšãåå«ã¯ã©ã¹std :: 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
ã°ããŒãã«å€æ°ãäœæããå¿
èŠããããŸãã error_code + expectedã䜿çšãããšã©ãŒåŠçã¯æ¬¡ã®ããã«ãªããŸãã
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ã«ããŸãã¯ãã®éã«çœ®ãæããå¿
èŠããããŸãã
ãã¹ãŠã®ã·ã¹ãã ãšã©ãŒã³ãŒãã¯ã errcããã³system_categoryã§èª¬æãããŠããŸãã ç¹å®ã®æ®µéã§ãšã©ãŒã³ãŒãã®æå転éãé¢åã«ãªã£ãå Žåã std::system_error
ã§ãšã©ãŒã³ãŒãããã€ã§ãã©ããããŠstd::system_error
ã
ç Žå£çãªåã/ç°¡åã«åé
眮å¯èœ
ããã€ãã®ãªãœãŒã¹ãææãããªããžã§ã¯ãã®å¥ã®ã¯ã©ã¹ãäœæããå¿
èŠããããŸãã ã»ãšãã©ã®å Žåã移åäžå¯èœãªãªããžã§ã¯ãïŒC ++ 17ããåã¯é¢æ°ããè¿ããªããªããžã§ã¯ãïŒãæäœããã®ã¯äžäŸ¿ã§ãããããã³ããŒäžå¯ã§ç§»åå¯èœã«ããããšæãã§ãããã
ããããåé¡ã¯æ¬¡ã®ãšããã§ãããããã«ããŠãã移åãããªããžã§ã¯ããåé€ããå¿
èŠããããŸãã ãããã£ãŠãç¹å¥ãªã移åå
ãç¶æ
ãã€ãŸãäœãåé€ããªãã空ã®ããªããžã§ã¯ããå¿
èŠã§ãã åC ++ã¯ã©ã¹ã¯ç©ºã®ç¶æ
ã§ããå¿
èŠããããŸããã€ãŸããã³ã³ã¹ãã©ã¯ã¿ãŒãããã¹ãã©ã¯ã¿ãŒãŸã§ãæ£ç¢ºæ§ã®äžå€ïŒä¿èšŒïŒãæã€ã¯ã©ã¹ãäœæããããšã¯ã§ããŸããã ããšãã°ããã®åç¶æéãéããŠéããŠãããã¡ã€ã«ã®æ£ããopen_file
ã¯ã©ã¹ãäœæããããšã¯äžå¯èœã§ãã RAIIãç©æ¥µçã«äœ¿çšããæ°å°ãªãèšèªã®1ã€ã§ããã芳å¯ããã®ã¯å¥åŠã§ãã
å¥ã®åé¡ã¯ã移åæã®å€ããªããžã§ã¯ãã®ãŒãåããªãŒããŒããããè¿œå ããããšã§ãïŒç§»åæã®å€ããã€ã³ã¿ãŒã®ãŒãåã®ããŒãã«ããã std::vector<std::unique_ptr<T>>
ãstd::vector<T*>
æ倧2åé
ãããããšãã§ããŸãããããŒã®åé€ãç¶ããŸãã
C ++éçºè
ã¯é·ãéãRustããªããŠããŸãããRustã§ã¯ãåé
眮ããããªããžã§ã¯ãã§ãã¹ãã©ã¯ã¿ãåŒã³åºãããŸããã ãã®æ©èœã¯ç Žå£ç移åãšåŒã°ããŸãã æ®å¿µãªãããProposal Trivially relocatableã§ã¯ãC ++ã«è¿œå ããããšã¯ã§ããŸããã ãããããªãŒããŒãããã®åé¡ã¯è§£æ±ºãããŸãã
å€ããªããžã§ã¯ãã®ç§»åãšåé€ã®2ã€ã®æäœããå€ããªããžã§ã¯ãããæ°ãããªããžã§ã¯ããžã®memcpyãšåçã§ããå Žåãã¯ã©ã¹ã¯èªæã«åé
眮å¯èœãšèŠãªãããŸãã å€ããªããžã§ã¯ãã¯åé€ããããäœæè
ã¯ãåºã«èœãšãããšåŒã³ãŸãã
次ã®ïŒååž°ïŒæ¡ä»¶ã®ãããããçã§ããå Žåãåã¯ã³ã³ãã€ã©ã®èŠ³ç¹ããèªæã«åé
眮å¯èœã§ãã
- ç°¡åã«ç§»åå¯èœ+ç°¡åã«ç Žå£å¯èœïŒ
int
ãŸãã¯PODæ§é ãªã©ïŒ - ããã¯ã
[[trivially_relocatable]]
å±æ§ã§ããŒã¯ãããã¯ã©ã¹ã§ã[[trivially_relocatable]]
- ããã¯ããã¹ãŠã®ã¡ã³ããŒãèªæã«åé
眮å¯èœãªã¯ã©ã¹ã§ãã
ãã®æ
å ±ã¯std::uninitialized_relocate
ã§äœ¿çšã§ããŸããããã¯ãéåžžã®æ¹æ³ã§move init + deleteãå®è¡ããããå¯èœã§ããã°å éããŸãã std::string
ã std::vector
ã std::unique_ptr
ãªã©ãã»ãšãã©ã®ã¿ã€ãã®æšæºã©ã€ãã©ãªã[[trivially_relocatable]]
ãšããŠããŒã¯ããããšããå§ãããŸãã ãªãŒããŒãããstd::vector<std::unique_ptr<T>>
ããã念é ã«çœ®ããŠææ¡ã¯æ¶ããŸãã
çŸåšãäŸå€ã®äœãåé¡ã«ãªã£ãŠããŸããïŒ
C ++äŸå€ã¡ã«ããºã ã¯1992幎ã«éçºãããŸããã ããŸããŸãªå®è£
ãªãã·ã§ã³ãææ¡ãããŠããŸãã ãããã®ãã¡ãããã°ã©ã å®è¡ã®ã¡ã€ã³ãã¹ã«ãªãŒããŒãããããªãããšãä¿èšŒããäŸå€ããŒãã«ã®ã¡ã«ããºã ãéžæãããŸããã ãªããªããããããäœæãããç¬éããã äŸå€ã¯éåžžã«ãŸãã«ããã¹ããŒãããªããšæ³å®ãããŠããããã§ãã
åçãªïŒã€ãŸããå®æçãªïŒäŸå€ã®æ¬ ç¹ïŒ
- ã¹ããŒãããäŸå€ã®å ŽåããªãŒããŒãããã¯å¹³åã§çŽ10,000ã100,000 CPUãµã€ã¯ã«ã§ãããææªã®å ŽåãçŽããªç§ã«éããå¯èœæ§ããããŸãã
- ãã€ããªãã¡ã€ã«ãµã€ãºã15ã38ïŒ
å¢å
- Cããã°ã©ãã³ã°ã€ã³ã¿ãŒãã§ã€ã¹ãšäºææ§ããªã
noexcept
ãé€ããã¹ãŠã®é¢æ°ã§ã®æé»çãªäŸå€ã¹ããŒã®ãµããŒãã é¢æ°ã®äœæè
ãäºæããªãå Žåã§ããããã°ã©ã å
ã®ã»ãšãã©ã©ãã§ãäŸå€ãã¹ããŒã§ããŸãã
ãããã®æ¬ ç¹ã«ãããäŸå€ã®ç¯å²ã¯å€§å¹
ã«å¶éãããŠããŸãã äŸå€ãé©çšã§ããªãå ŽåïŒ
- 決å®è«ãéèŠãªå Žåãã€ãŸããã³ãŒããéåžžããã10ã100ã1000åé
ãåäœããããšã蚱容ã§ããªãå Žå
- ãã€ã¯ãã³ã³ãããŒã©ãŒãªã©ãABIã§ãµããŒããããŠããªãå Žå
- ã³ãŒãã®å€§éšåãCã§èšè¿°ãããŠããå Žå
- ã¬ã¬ã·ãŒã³ãŒãã倧éã«ããäŒç€ŸïŒ Google Style Guide ã Qt ïŒã ã³ãŒãã«å°ãªããšã1ã€ã®éäŸå€ã»ãŒãé¢æ°ãããå Žåãå¹³åã®æ³åã«åŸã£ãŠãé
ããæ©ããäŸå€ãã¹ããŒããããã°ãäœæãããŸã
- äŸå€ã®å®å
šæ§ã«ã€ããŠãŸã£ããç¥ããªãããã°ã©ããŒãéã£ãŠããäŒæ¥
調æ»ã«ãããšã52ïŒ
ïŒïŒïŒã®éçºè
ã®è·å Žã§ã¯ãäŒæ¥ã®èŠåã«ããäŸå€ãçŠæ¢ãããŠããŸãã
ããããäŸå€ã¯C ++ã®äžå¯æ¬ ãªéšåã§ãïŒ -fno-exceptions
ãã©ã°ãå«ãããšãéçºè
ã¯æšæºã©ã€ãã©ãªã®éèŠãªéšåã䜿çšã§ããªããªããŸãã ããã«ãããäŒæ¥ã¯ç¬èªã®ãæšæºã©ã€ãã©ãªããäœæããã¯ããç¬èªã®æååã¯ã©ã¹ãçºæããããã«ãªããŸãã
ããããããã§çµããã§ã¯ãããŸããã äŸå€ã¯ãã³ã³ã¹ãã©ã¯ã¿ãŒã§ãªããžã§ã¯ãã®äœæããã£ã³ã»ã«ããŠãšã©ãŒãã¹ããŒããå¯äžã®æšæºçãªæ¹æ³ã§ãã ãããããªãã«ãªããšã2ãã§ãŒãºåæåãªã©ã®ææªãçŸããŸãã æŒç®åããšã©ãŒã³ãŒãã䜿çšã§ããªãããã assign
ãªã©ã®é¢æ°ã«çœ®ãæããããŸãã
ææ¡ïŒæªæ¥ã®äŸå€
æ°ããäŸå€è»¢éã¡ã«ããºã
P709ã®ããŒããµãã¿ãŒã¯ãæ°ããäŸå€è»¢éã¡ã«ããºã ã«ã€ããŠèª¬æããŸããã ååãšããŠãé¢æ°ã¯std::expected
è¿ããŸããã bool
åã®åå¥ã®èå¥åã®ä»£ããã«ãã¢ã©ã€ã¡ã³ããšå
±ã«ã¹ã¿ãã¯ã§æ倧8ãã€ããå æããŸãããã®ãããã®æ
å ±ã¯ããã£ãªãŒãã©ã°ãªã©ãããé«éãªæ¹æ³ã§éä¿¡ãããŸãã
CFã«è§Šããªãé¢æ°ïŒã»ãšãã©ïŒã¯ãéåžžã®æ»ãã®å ŽåãšäŸå€ãã¹ããŒããå Žåã®äž¡æ¹ã§ãéçäŸå€ãç¡æã§äœ¿çšããæ©äŒãåŸãŸãïŒ ä¿åããã³åŸ©å
ã匷å¶ãããé¢æ°ã¯ãæå°éã®ãªãŒããŒããããåãåããŸããã 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; } }
代æ¿ããŒãžã§ã³ã§ã¯ã throws
é¢æ°åŒã³åºããšåãåŒã«try
ããŒã¯ãŒããèšå®ããããšããtry i + safe_divide(j, k)
ãŸãïŒ try i + safe_divide(j, k)
ã ããã«ãããäŸå€ã«å¯ŸããŠå®å
šã§ãªãã³ãŒãã§throws
é¢æ°ã䜿çšããã±ãŒã¹ã®æ°ãã»ãŒãŒãã«ãªããŸãã ãããã®å Žåã§ããåçãªäŸå€ãšã¯ç°ãªããIDEã«ã¯äŸå€ãã¹ããŒããåŒãäœããã®æ¹æ³ã§åŒ·èª¿è¡šç€ºããæ©èœããããŸãã
ã¹ããŒãããäŸå€ã¯åå¥ã«æ ŒçŽããããè¿ãããå€ã®å Žæã«çŽæ¥çœ®ããããšããäºå®ã¯ãäŸå€ã®ã¿ã€ãã«å¶éã課ããŸãã ãŸããç°¡åã«åé
眮ã§ããå¿
èŠããããŸãã 第äºã«ããã®ãµã€ãºã¯ããŸã倧ãããŠã¯ãããŸããïŒãã ãã std::unique_ptr
ãããªãã®ã«ããããšãã§ããŸãïŒã
status_code
Niall Douglasãéçºãã<system_error2>
ã©ã€ãã©ãªã«ã¯ã status_code<T>
-"newãbetter" error_code
ãå«ãŸããŸãã error_code
ã®äž»ãªéãïŒ
status_code
éçäŸå€ã䜿çšããã«ãïŒ status_code_category
ãžã®ãã€ã³ã¿ãŒãšãšãã«ïŒèããããã»ãšãã©ãã¹ãŠã®ãšã©ãŒã³ãŒããæ ŒçŽããããã«äœ¿çšã§ãããã³ãã¬ãŒãã¿ã€ãT
ã¯ãç°¡åã«åé
眮å¯èœããã³ã³ããŒå¯èœã«ããå¿
èŠããããŸãïŒåŸè
ãIMHOã¯å¿
é ã§ã¯ãããŸããïŒã ã³ããŒããã³åé€ãããšããä»®æ³é¢æ°ã¯status_code_category
ããåŒã³åºããstatus_code_category
status_code
ã¯ããšã©ãŒããŒã¿ã ãã§ãªããæ£åžžã«å®äºããæäœã«é¢ããè¿œå æ
å ±ãæ ŒçŽã§ããŸãã- ãä»®æ³ãé¢æ°
code.message()
ã¯std::string
è¿ããŸãããã string_ref
ã¯ããªãéãæåååã§ãä»®æ³ã®ãææããŠããå¯èœæ§ã®ããã std::string_view
ã§ãã ããã§ã string_view
ãŸãã¯string
ããŸãã¯std::shared_ptr<string>
ããŸãã¯æååãææããä»ã®ã¯ã¬ã€ãžãŒãªæ¹æ³ãstring_view
ããšãã§ããŸãã Niallã¯ã #include <string>
ãããããŒ<system_error2>
容èªã§ããªãã»ã©ãéããããã ãããšäž»åŒµããŠã#include <string>
次ã«ã 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
ã§ä¿åã§ãerror
ã å®éã«ã¯ãããã¯æ¬¡ã®ãªãã·ã§ã³ã®ããããã«ãªããŸãã
- æŽæ°ïŒintïŒ
std::exception_handle
ãã€ãŸãã¹ããŒãããåçäŸå€ãžã®ãã€ã³ã¿ãŒstatus_code_ptr
ãã€ãŸãunique_ptr
ããä»»æã®status_code<T>
ã
åé¡ã¯ãã±ãŒã¹3ãstatus_code<T>
error
æ»ãæ©äŒãäžããããšãèšç»ããŠããªãããšã§ãã ã§ããããšã¯message()
packed status_code<T>
message()
ååŸããããšã ãã§ãã error
ã§ã©ãããããå€ãååŸã§ããããã«ããã«ã¯ãåçãªäŸå€ãšããŠã¹ããŒããå¿
èŠããããŸãïŒïŒïŒã次ã«ã error
ãã£ããããŠã©ããããå¿
èŠãããerror
ã äžè¬ã«ãNiallã¯ããšã©ãŒã³ãŒããšæååã¡ãã»ãŒãžã®ã¿ãerrorã«æ ŒçŽããå¿
èŠããããšèããŠã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"); } }
è€æ°ã®catchãããã¯ãŸãã¯dynamic_cast
ã䜿çšããŠäŸå€ã®ã¿ã€ããéžæãããšå€±æããŸãïŒ
åçãªäŸå€ãšã®çžäºäœçš
é¢æ°ã«ã¯ã次ã®ä»æ§ã®ããããããããŸãã
noexcept
ïŒäŸå€ãã¹ããŒããŸããthrows(E)
ïŒéçäŸå€ã®ã¿ãã¹ããŒããŸã- ïŒãªãïŒïŒåçäŸå€ã®ã¿ãã¹ããŒããŸã
throws
noexcept
throws
æå³ãnoexcept
ã åçãªäŸå€ããéçãé¢æ°ããã¹ããŒããããšã error
ã©ããããerror
ã éçãªäŸå€ããåçãªãé¢æ°ããã¹ããŒããããšã status_error
äŸå€ã«ã©ãããããŸãã äŸïŒ
void foo() throws(arithmetic_errc) { throw erithmetic_errc::divide_by_zero; } void bar() throws {
Cã®äŸå€ïŒïŒ
ãã®ææ¡ã§ã¯ãå°æ¥ã®Cæšæºã®1ã€ã«äŸå€ãè¿œå ããããšãèŠå®ãããŠããããããã®äŸå€ã¯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()
-C ++ 20ã§åé€ãããŸããnoexcept
é¢æ°æå®åãé¢æ°ã¯åçäŸå€ãã¹ããŒããŸããnoexcept(expression)
-é¢æ°æå®åãé¢æ°ã¯æäŸãããåçãªäŸå€ãã¹ããŒããŸããnoexcept(expression)
-åŒã¯åçãªäŸå€ãã¹ããŒããŸããïŒthrows(E)
-é¢æ°æå®åãé¢æ°ã¯éçäŸå€ãã¹ããŒããŸãthrows
= throws(std::error)
fails(E)
-Cããã€ã³ããŒããããé¢æ°ã¯éçäŸå€ãã¹ããŒããŸã
ãã®ãããC ++ã§ã¯ããšã©ãŒåŠççšã®æ°ããããŒã«ã®ã«ãŒããå°å
¥ïŒãŸãã¯å°å
¥ïŒããŸããã 次ã«ãè«ççãªè³ªåãçºçããŸãã
äœã䜿çšããã®ãïŒ
äžè¬çãªæ¹å
ãšã©ãŒã¯ããã€ãã®ã¬ãã«ã«åããããŸãã
- ããã°ã©ããŒã®ãšã©ãŒã å¥çŽã䜿çšããŠåŠçãããŸãã ãããã¯ã ãã§ã€ã«ãã¡ã¹ãã®æŠå¿µã«åŸã£ãŠãã°ã®åéãšããã°ã©ã ã®çµäºããããããŸãã äŸïŒnullãã€ã³ã¿ãŒïŒãããç¡å¹ãªå ŽåïŒ; ãŒãé€ç®; ããã°ã©ããŒãäºæž¬ããªãã¡ã¢ãªå²ãåœãŠãšã©ãŒã
- ããã°ã©ããæäŸããèŽåœçãªãšã©ãŒã é¢æ°ããã®éåžžã®æ»ãå€ãããçŸäžåå°ãªãé »åºŠã§ã¹ããŒãããŸããããã«ãããåçäŸå€ãæ£åœåãããŸãã éåžžããã®ãããªå Žåãããã°ã©ã ã®ãµãã·ã¹ãã å
šäœãåèµ·åããããæäœã®å®è¡æã«ãšã©ãŒãçºçãããå¿
èŠããããŸãã äŸïŒããŒã¿ããŒã¹ãšã®æ¥ç¶ãçªç¶å€±ãããã ããã°ã©ããæäŸããã¡ã¢ãªå²ãåœãŠãšã©ãŒã
- äœããé¢æ°ã®ã¿ã¹ã¯ã®å®äºã劚ããããåŒã³åºãå
ã®é¢æ°ããããã©ãããããç¥ã£ãŠããå Žåã®å埩å¯èœãªãšã©ãŒã éçäŸå€ã«ãã£ãŠåŠçãããŸãã äŸïŒãã¡ã€ã«ã·ã¹ãã ãæäœããŸãã ãã®ä»ã®å
¥åºåïŒIOïŒãšã©ãŒã äžæ£ãªãŠãŒã¶ãŒããŒã¿
vector::at()
ã - é¢æ°ã¯ãäºæããªãçµæã§ã¯ãããã®ã®ãã¿ã¹ã¯ãæ£åžžã«å®äºããŸããã
std::optional
ã std::expected
ã std::variant
ãŸãã äŸïŒ stoi()
; vector::find()
; map::insert
ã
æšæºã©ã€ãã©ãªã§ã¯ãã³ã³ãã€ã«ããäŸå€ãªãã§ãåæ³ã«ããããã«ãåçäŸå€ã®äœ¿çšãå®å
šã«æŸæ£ããããšãæãä¿¡é Œã§ããŸãã
errno
errno
ã䜿çšããŠCããã³C ++ãšã©ãŒã³ãŒãããã°ããç°¡åã«åŠçããé¢æ°ã¯ãããããthrows(std::errc)
fails(int)
ããã³throws(std::errc)
ã«çœ®ãæããå¿
èŠããããŸãã ãã°ããã®éãæšæºã©ã€ãã©ãªã®é¢æ°ã®å€ãããŒãžã§ã³ãšæ°ããããŒãžã§ã³ãå
±åããå€ãããŒãžã§ã³ã¯å»æ¢ããããšå®£èšãããŸãã
ã¡ã¢ãªãŒäžè¶³
ã¡ã¢ãªå²ãåœãŠãšã©ãŒã¯ã new_handler
ã°ããŒãã«ããã¯ã«ãã£ãŠåŠçãããŸãã
- ã¡ã¢ãªäžè¶³ã解æ¶ããå®è¡ãç¶ç¶ãã
- äŸå€ãæãã
- ã¯ã©ãã·ã¥ããã°ã©ã
çŸåšã std::bad_alloc
ããã©ã«ãstd::bad_alloc
ã¹ããŒãããŸãã ããã©ã«ãã§std::terminate()
ãåŒã³åºãããšããå§ãããŸãã å€ãåäœãå¿
èŠãªå Žåããã³ãã©ãmain()
å
é ã§å¿
èŠãªãã®ã«çœ®ãæããŸãã
æšæºã©ã€ãã©ãªã®æ¢åã®é¢æ°ã¯ãã¹ãŠnoexcept
ãªãã std::bad_alloc
ãšãã«ããã°ã©ã ãã¯ã©ãã·ã¥ãstd::bad_alloc
ã åæã«ã vector::try_push_back
ãªã©ã®æ°ããAPIãè¿œå ãããã¡ã¢ãªå²ãåœãŠãšã©ãŒãèš±å¯ãããŸãã
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 -Niall Douglas Visionã®äŸå€ã®æ±ºå®ãããã€ãã®ç¹ã®å€æŽãCèšèªã®äºææ§ã®è¿œå
- P1028 -
std::error
ã®ãã¹ãå®è£
ããã®API std::error
çŸåšãéçãªäŸå€ããµããŒãããã³ã³ãã€ã©ã¯ãããŸããã ãããã£ãŠããã³ãããŒã¯ãäœæããããšã¯ãŸã ã§ããŸããã
C++23. , , , C++26, , , .
ãããã«
, , . , . .
, ^^