æŠèŠ
C++17ãšã¯ã2017幎12æã«æ¹èšãããISO/IEC 14882:2017ã§æšæºèŠæ ŒåãããC++ããŒãžã§ã³ã®éç§°ã§ããã
ãã®ããŒãžã§ã³ã¯ãçå®äžã¯C++1zãšåŒã°ããŠãããåããŒãžã§ã³ã§ããC++11ãçå®äžã«C++0xãšåŒã°ããC++14ãC++1yãšåŒã°ããŠãããã201z幎ã«ãªãªãŒã¹ãããããšãã幎æ°ã®äŒãåãšããŠãzãã䜿ãããŠããã
çå®äœå¶
C++14ã®çå®éå§æ®µéãããStudy Group (SG)ããšåŒã°ããå°éå®¶ã°ã«ãŒããè€æ°äœãããããã§åæäžŠè¡ã«æ°æ©èœã®è°è«ãçå®ãé²ããããŠãããC++14ã§ã¯ãããã®æ©èœã¯å°å ¥ãããªãã£ãããC++17ã§ã¯SGã§è°è«ãããæ©èœã®ãã¡ã仿§ãåºãŸã£ããã®ã®ããã€ããå°å ¥ãããããšãšãªã£ãã
åSGã§èãããã仿§ã¯ãTechnical Specification (TS)ããšããåäœã§åå¥ã«ååœã®æ¿èªããšã£ãŠããããã®æ®µéã§ã¯ãã©ã€ãã©ãªæ©èœã¯std::experimentalåå空éãªã©ã§åã³ã³ãã€ã©ãå®éšçã«ãµããŒããããŠãããããã¯ã³ã³ãã€ã©ãå®è£
çµéšãç©ã¿ããŠãŒã¶ãŒã䜿çšçµéšãåŸãŠããæšæºã«æ¡çšããããã§ããã
C++17ã§ã¯ä»¥äžã®TSãæ¡çšãããïŒ
| TS | 説æ |
|---|---|
| Library Fundamentals TS | åºæ¬çãªã©ã€ãã©ãªæ©èœãany, optional, string_view, ã¡ã¢ãªããŒã«, æ€çŽ¢ã¢ã«ãŽãªãºã , ãµã³ããªã³ã°ã¢ã«ãŽãªãºã , ã¿ãã«ãå±éããŠé¢æ°åŒã³åºãããapply颿°, shared_ptrã®é
å察å¿, æå€§å
¬çŽæ°ãšæå°å
¬åæ°ãªã©ãå«ãŸãã |
| Filesystem TS | ãã¡ã€ã«ã·ã¹ãã ã®ã©ã€ãã©ãª |
| Parallelism TS | 䞊åã©ã€ãã©ãªã<algorithm>ã<numeric>ã«äžŠåã¢ã«ãŽãªãºã ã远å ããã |
C++17以éãèšèªã®çå®ã«ship train modelãšãããªãªãŒã¹äœå¶ãèšãããããããã¯ã3幎ããšã®å®æçãªèšèªã¢ããããŒããæäŸããããã«ãã仿§ã宿ããããªãªãŒã¹ãã§ã¯ãªãã宿ãã仿§ããé æ¬¡ãªãªãŒã¹ã«å«ããããšããäœå¶ã§ãããããã«ãããã¡ãžã£ãŒã¢ããããŒãïŒãã€ããŒã¢ããããŒããšããããŒãžã§ã³ã¢ããã¯ãªããªã£ãã
èšèªæ©èœ
倿°ã»ããŒã¿æ§é é¢ä¿
| èšèªæ©èœ | 説æ |
|---|---|
| 16鲿µ®åå°æ°ç¹æ°ãªãã©ã« | åå 鲿°è¡šèšã§æµ®åå°æ°ç¹æ°ãªãã©ã«ãèšè¿°ã§ããããã«ãã |
| ã€ã³ã©ã€ã³å€æ° | inlineæå®ãããããšã§ç¿»èš³åäœãè·šãã§ã²ãšã€ã®ãªããžã§ã¯ãã«ãªã倿°ãå®çŸ©ãã |
| æ§é åæçž | çµã»ã¿ãã«ã»é åãå±éããŠå€æ°å®çŸ©ãã |
| åäžèŠçŽ ã®æ³¢ã«ãã³åæåãéé åãšãã | æ³¢ã«ãã³åæååãåäžèŠçŽ ã®å Žå㯠T ã«æšè«ïŒè€æ°èŠçŽ ã®å Žåã¯äžé©æ Œ |
[[maybe_unused]]屿§ |
䜿çšããªãå¯èœæ§ã®ãã倿°ã«å¯ŸããèŠåãæå¶ãã |
[[nodiscard]]屿§ |
æ»ãå€ãæšãŠãŠã¯ãªããªãããšãæå®ãã |
| å€ã®ã³ããŒçç¥ãä¿èšŒ | å³èŸºå€ã倿°ã®åæåã®ããã«äœ¿çšããå Žåãã³ããŒãã ãŒããçç¥ããããšãä¿èšŒ |
| å³å¯ãªåŒã®è©äŸ¡é | åŒã®è©äŸ¡é ãèŠå®ãã |
| åç §ã¡ã³ãããã€ã¯ã©ã¹ã®çœ®ãæã | åç
§åã¡ã³ããconstã¡ã³ã倿°ãå«ãã¯ã©ã¹ã«ã€ããŠãããŸã§æªå®çŸ©åäœãšãããŠããé
眮newã«ãããªããžã§ã¯ãã®çœ®ãæããæ¡ä»¶ä»ãã§å¯èœãšãã |
enum class倿°ã®åæå€ãšããŠæŽæ°ãæå®ããéã®èŠåãèª¿æŽ |
ãã£ã¹ãã䜿çšããããšãªãæŽæ°ãåæå€ãšããŠäœ¿çšããE e{0};ã®ãããªåæåãèš±å¯ |
| ã¢ã©ã€ã¡ã³ãæå®ãããããŒã¿ã®åçã¡ã¢ãªç¢ºä¿ | operator newãšoperator deleteã§ã¢ã©ã€ã¡ã³ãå€ãååŸã§ããããã«ãã |
| åºåºã¯ã©ã¹ã®ã¡ã³ã倿°ãéæäœåæåããããã®æ³¢ã«ãã³ãçç¥ã§ããããã«ãã | åºåºã¯ã©ã¹ã®ã¡ã³ããéæäœåæåããããã«ã derived d {{42}}; ã®ä»£ããã« derived d {42}; ãšæžããããã«ãã |
å¶åŸ¡æ§æ
| èšèªæ©èœ | 説æ |
|---|---|
ifæãšswitchæã®æ¡ä»¶åŒãšåæåãåé¢ |
if (init; condition)ã®ããã«åæåãšæ¡ä»¶åŒãåããŠèšè¿°ã§ããããã«ãã |
[[fallthrough]]屿§ |
ãã©ãŒã«ã¹ã«ãŒæã®èŠåãæå¶ãã |
constexpr ifæ |
if constexpr(cond)ãšããããšã§ããã®ifæã¯ã³ã³ãã€ã«æã«åŠçããã |
| ç¯å²foræã®ã€ãã¬ãŒã¿åãäžèŽããªãããšãèš±å¯ | ç¯å² for æã® begin() ãš end() ãç°ãªãã€ãã¬ãŒã¿åãè¿ããããã«ããããšã§ãçµç«¯ã€ãã¬ãŒã¿ãå®çŸ©ãããããã |
ã©ã ãåŒ
| èšèªæ©èœ | 説æ |
|---|---|
ã©ã ãåŒã§ã®*thisã®ã³ããŒãã£ãã㣠|
ãã£ããã£ãªã¹ãã«*thisãæå®ããããšã§ã*thisãã³ããŒãã£ããã£ãã |
constexprã©ã ã |
ã©ã ãåŒã®é¢æ°ãªããžã§ã¯ãã宿°åŒã®æèã§äœ¿çšãããå Žåã«ããããã³ã³ãã€ã«æã«è©äŸ¡ãããããã«ãã |
ãã³ãã¬ãŒã
| èšèªæ©èœ | 説æ |
|---|---|
| ç³ã¿èŸŒã¿åŒ | ãã©ã¡ãŒã¿ããã¯ã«å¯Ÿããäºé æŒç®ã®çޝç©åŠç |
ãã³ãã¬ãŒããã³ãã¬ãŒããã©ã¡ãŒã¿ã«typenameããŒã¯ãŒãã®äœ¿çšãèš±å¯ |
classããŒã¯ãŒããã䜿çšã§ããªãã£ãéšåã«ãtypenameãèš±å¯ãã |
| ã¯ã©ã¹ãã³ãã¬ãŒãã®ãã³ãã¬ãŒãåŒæ°æšè« | ã³ã³ã¹ãã©ã¯ã¿ã®åŒæ°ããã¯ã©ã¹ã®ãã³ãã¬ãŒãåŒæ°ãæšè«ã§ããããã«ãã |
éåãã³ãã¬ãŒããã©ã¡ãŒã¿ã®autoå®£èš |
template <auto x>ãšããããšã§ãX<3>; X<true>; X<'a'>ã®ããã«å®æ°ãåãåãããããã |
| å šãŠã®éåãã³ãã¬ãŒãåŒæ°ã®å®æ°åŒè©äŸ¡ãèš±å¯ | ãã€ã³ã¿ã®å®æ°åŒè©äŸ¡ãšããŠãé åãããã€ã³ã¿ãžã®å€æãã颿°ãã颿°ãã€ã³ã¿ãžã®å€æãªã©ãèš±å¯ |
using宣èšã®ããã¯å±é |
ãã©ã¡ãŒã¿ããã¯ã®åãåºåºã¯ã©ã¹ãšããŠæå®ããå Žåã«ãusing宣èšã«åºåºã¯ã©ã¹ã®ãã©ã¡ãŒã¿ããã¯ãæå®ã§ããããã«ãã |
| 倿°ãã³ãã¬ãŒãã®ããã©ã«ããã³ãã¬ãŒãåŒæ°ãèš±å¯ | 倿°ãã³ãã¬ãŒãã®ãã³ãã¬ãŒããã©ã¡ãŒã¿ãããã©ã«ãåŒæ°ãæã€ããšãèš±å¯ãã |
宿°åŒ
| èšèªæ©èœ | 説æ |
|---|---|
static_assertã®ã¡ãã»ãŒãžçç¥ãèš±å¯ |
第2åŒæ°ã ã£ã蚺æã¡ãã»ãŒãžã®çç¥ãèš±å¯ãã |
constexprã©ã ã |
ã©ã ãåŒã®é¢æ°ãªããžã§ã¯ãã宿°åŒã®æèã§äœ¿çšãããå Žåã«ããããã³ã³ãã€ã«æã«è©äŸ¡ãããããã«ãã |
if constexpræ |
if constexpr(cond)ãšããããšã§ããã®ifæã¯ã³ã³ãã€ã«æã«åŠçããã |
åå空é
| èšèªæ©èœ | 説æ |
|---|---|
| å ¥ãååå空éã®å®çŸ© | namespace A::B {}ã®ããã«ãå
¥ãåã®åå空éãç°¡åã«å®çŸ©ã§ããããã«ãã |
| åå空éãšåæåãžã®å±æ§ä»å ãèš±å¯ | åå空éã®å®çŸ©ãšãåæåã®åèŠçŽ ã®å®çŸ©ã«ã屿§ãä»ããããããã«ãã |
using宣èšã®ããã¯å±é |
ãã©ã¡ãŒã¿ããã¯ã®åãåºåºã¯ã©ã¹ãšããŠæå®ããå Žåã«ãusing宣èšã«åºåºã¯ã©ã¹ã®ãã©ã¡ãŒã¿ããã¯ãæå®ã§ããããã«ãã |
äŸå€
| èšèªæ©èœ | 説æ |
|---|---|
| äŸå€ä»æ§ãåã·ã¹ãã ã®äžéšã«ãã | 颿°ã®åã«äŸå€ä»æ§ãå«ãŸããããã«ãã |
| éæšå¥šã ã£ãå€ãäŸå€ä»æ§ãåé€ | throwããŒã¯ãŒãã«ããäŸå€ä»æ§ãåé€ãthrow()ã¯æ®ã |
屿§
| èšèªæ©èœ | 説æ |
|---|---|
[[fallthrough]]屿§ |
ãã©ãŒã«ã¹ã«ãŒæã®èŠåãæå¶ãã |
[[maybe_unused]]屿§ |
䜿çšããªãå¯èœæ§ã®ãã倿°ã«å¯ŸããèŠåãæå¶ãã |
[[nodiscard]]屿§ |
æ»ãå€ãæšãŠãŠã¯ãªããªãããšãæå®ãã |
| åå空éãšåæåãžã®å±æ§ä»å ãèš±å¯ | åå空éã®å®çŸ©ãšãåæåã®åèŠçŽ ã®å®çŸ©ã«ã屿§ãä»ããããããã«ãã |
| 屿§ã®åå空éæå®ã«ç¹°ãè¿ãããªãã | [[using CC: opt(1), debug]]ã®ããã«å±æ§ã®åå空é宣èšããŸãšããŠè¡ã |
| äžæãªå±æ§ãç¡èŠãã | å®è£ ãç¥ããªãåå空éã®å±æ§ã¯ç¡èŠãã |
ããªããã»ããµ
| èšèªæ©èœ | 説æ |
|---|---|
__has_include |
ã€ã³ã¯ã«ãŒããããã¡ã€ã«ãååšãããã確èªãã |
æ©èœã®åé€
| èšèªæ©èœ | 説æ |
|---|---|
| ãã©ã€ã°ã©ãã®åé€ | çŸä»£ã§ã¯äœ¿çšããå¿ èŠããªããªã£ããã©ã€ã°ã©ãæ©èœãåé€ |
éæšå¥šã ã£ãregisterããŒã¯ãŒããåé€ |
ã³ã³ãã€ã©ããåã«ç¡èŠãããŠããregisterããŒã¯ãŒããåé€ãäºçŽèªã¯æ®ã |
éæšå¥šã ã£ãboolåã«å¯Ÿããã€ã³ã¯ãªã¡ã³ãæŒç®åãåé€ |
bool倿°ã«å¯ŸããŠ++ãããštrueã«ãªã仿§ãåé€ |
| éæšå¥šã ã£ãå€ãäŸå€ä»æ§ãåé€ | throwããŒã¯ãŒãã«ããäŸå€ä»æ§ãåé€ãthrow()ã¯æ®ã |
å°ããªå€æŽ
ããã§ã¯ãã³ã¢èšèªäœæ¥ã°ã«ãŒããžåé¡å ±åããããã®è§£æ±ºçãšããŠå°å ¥ãããèšèªä»æ§ã®å€æŽã解説ããã
| èšèªæ©èœ | 説æ |
|---|---|
| æŽæ°ãããå®çŸ©æžã¿ãã¯ã | æšæºèŠæ Œã§å®çŸ©ããããã¯ãã®æŽæ° |
| æ©èœãã¹ããã¯ã | C++17 ã®æ©èœããµããŒããããŠãããã©ããããã¹ãããããã®ãã¯ã |
noexceptä»ãã®ã©ã ãåŒãã倿ãã颿°ãã€ã³ã¿ã«noexceptãä»å ãã |
ãã£ããã£ãæããªãéãžã§ããªãã¯ã©ã ãã«noexceptãä»å ããå Žåã倿ãã颿°ãã€ã³ã¿ã«noexceptãä»å ãã |
| UTF-8æåãªãã©ã« | UTF-8ã®æå®ãæååãªãã©ã«ã«å¯ŸããŠããã§ããªãã£ãããæåãªãã©ã«ã«ãUTF-8æå®ãã§ããããã«ãã |
ã©ã€ãã©ãªæŽæ°ã®æŠèŠ
æ°ã©ã€ãã©ãª
<filesystem>ããããæ°èšãããã¡ã€ã«ã·ã¹ãã ã©ã€ãã©ãªã远å ããã¡ã€ã«ããã£ã¬ã¯ããªãªã©ãæ±ã<algorithm>ã<numeric>ã®ã¢ã«ãŽãªãºã ã«ã䞊åå®è¡ã®ãªãã·ã§ã³ã远å<optional>ããããæ°èšããçµ±äžçãªæå¹å€ãšç¡å¹å€ã®è¡šçŸããã€optionalã¯ã©ã¹ã远å<variant>ããããæ°èšããåå®å šãªå ±çšäœvariantã¯ã©ã¹ã远å<any>ããããæ°èšãããªãã§ãä»£å ¥ã§ããanyã¯ã©ã¹ã远å- æšæºã©ã€ãã©ãªã®åç
§ãC11ã«æŽæ°
<cfloat>ã«ã鿣èŠåæ°ã®æç¡ãå€å®ãããã¯ãã10鲿°ã®æ¡æ°ã衚ããã¯ããæ£ã®æå°æ°ã衚ããã¯ãã远å<cstdlib>ã«ãaligned_alloc()颿°ã远å<ctime>ã«ãTIME_UTCãã¯ã,timespecæ§é äœ,timespec_get()颿°ã远å<cstdio>ã«ãvfscanf()颿°ã远å<ccomplex>,<cstdalign>,<cstdbool>,<ctgmath>ãéæšå¥šå
ã³ã³ãã
- ã³ã³ããã®ã³ããŒã»ã ãŒãã
swapæäœã«noexceptã远å - ã³ã³ããã®èŠçŽ æ
å ±ã«ã¢ã¯ã»ã¹ããéã¡ã³ã颿°ãšããŠã
<iterator>ã«size(),empty(),data()颿°ã远å - ã³ã³ããã«äžå®å
šåã®æå°ãµããŒãã远å ã
vector,list,forward_listã®èŠçŽ åã«ãäžå®å šåã®æå®ãèš±å¯ããã ãããããã®ã³ã³ããã®ãªãããã®ã¡ã³ã颿°ãåŒã³åºãåã«ã¯ãèŠçŽ åãå®å šåã«ãªã£ãŠããããš - å€çžã¢ãã±ãŒã¿ãšã¡ã¢ãªããŒã«ã
<memory_resource>ãæ°èšãããã¢ãã±ãŒãããåãèŠå®ããªãã¢ãã±ãŒã¿ãšããããå©çšããã¡ã¢ãªããŒã«ã®ä»çµã¿ãå°å ¥ããã - æšæºã€ãã¬ãŒã¿å
šè¬ãš
arrayã®å€æŽæäœã«constexprã远å emplace_front()ãšemplace_back()ã¡ã³ã颿°ã§ã远å ãããèŠçŽ ãè¿ãããã«ãã- 飿³ã³ã³ããã®æ¥åæ©èœã远å ãã»ãã®ã³ã³ããã«èŠçŽ ãç§»ãããã«æœåºãã
extract()ã¡ã³ã颿°ãæœåºãããèŠçŽ ãã»ãã®ã³ã³ããã«ç§»ãããã®insert()ã¡ã³ã颿°ã®ãªãŒããŒããŒãã2ã€ã®é£æ³ã³ã³ããããŸãããšæ¥åããmerge()ã¡ã³ã颿°ã远å mapãšunordered_mapã«ãæ¿å ¥å€±ææã®åäœãèŠå®ããæ°ããªã¡ã³ã颿°ãšããŠãtry_emplace()ãšinsert_or_assign()ã远å- ã€ãã¬ãŒã¿ã®åé¡ã«ã飿¥ã€ãã¬ãŒã¿ (contiguous iterator)ãã远å ãèŠçŽ éã®ã¡ã¢ãªã飿¥ããŠããããšã衚ãã以äžã®ã³ã³ããã®ã€ãã¬ãŒã¿ã¯ã飿¥ã€ãã¬ãŒã¿ã§ããããšãèŠå®ãããïŒ
basic_stringarraybool以å€ãèŠçŽ åãšããvectorvalarray(ã®éã¡ã³ã颿°ã§ããstd::begin()ãstd::end()ã§è¿ãããã€ãã¬ãŒã¿ã¯é£æ¥ã€ãã¬ãŒã¿)
ã¢ã«ãŽãªãºã
- ã©ã³ãã ãµã³ããªã³ã°ã¢ã«ãŽãªãºã ãšããŠã
sample()ã远å - 䞊åã¢ã«ãŽãªãºã ã®è¿œå ã«ãšããªãã
<algorithm>ã«for_each_n()ã远å - 䞊åã¢ã«ãŽãªãºã ã®è¿œå ã«ãšããªãã
<numeric>ã«ä»¥äžã远å ïŒaccumulate()ã®èšç®é åºãèŠå®ããªãããŒãžã§ã³ã§ãããreduce()ã远å- éšååãæ±ãã颿°
partial_sum()ããiçªç®ã®éšååãæ±ããéã«içªç®ã®èŠçŽ ãå«ããã»å«ããªãã§åå²ããinclusive_scan()ãšexclusive_scan()ã远å - å€ã倿ããªããç³ã¿èŸŒã
transform_reduce()ã远å - å€ã倿ããªããéšååãæ±ãã颿°ãšããŠã
transform_inclusive_scan()ãštransform_exclusive_scan()ã远å
- å€ãç¯å²å
ã«åãã
clamp()颿°ã远å boolãè¿ã颿°ãªããžã§ã¯ãã®çµæãå転ãããnot_fn()颿°ã远å- INVOKEèŠä»¶ã«åŸã£ã颿°åŒã³åºãããã
invoke()颿°ã远å reference_wrapperãTriviallyCopyableã§ããããšãä¿èšŒ- ãªããžã§ã¯ãã
constã«ããas_const()颿°ã远å - æªåæåã¡ã¢ãªã®ã¢ã«ãŽãªãºã ãšããã¹ãã©ã¯ã¿åŒã³åºãã®é¢æ°ãšããŠã以äžã®é¢æ°ã远å ïŒ
destroy_at(),destroy(),destroy_n(),uninitialized_move(),uninitialized_move_n(),uninitialized_value_construct(),uninitialized_value_construct_n(),uninitialized_default_construct(),uninitialized_default_construct_n()
æåå
<string_view>ããããæ°èšããæææš©ãæããªãæååã¯ã©ã¹ã§ããbasic_string_viewã远åbasic_string::data()ã¡ã³ã颿°ã®éconstçã远å- æååæ€çŽ¢ã¢ã«ãŽãªãºã ãšããŠãããã€ã€ãŒã»ã ãŒã¢æ³ (Boyer-Moore)ãã®
std::boyer_moore_searcher颿°ãªããžã§ã¯ããšããã€ã€ãŒã»ã ãŒã¢ã»ããŒã¹ããŒã«æ³ (Boyer-Moore-Horspool)ãã®std::boyer_moore_horspool_searcher颿°ãªããžã§ã¯ãã远å ãstd::search()颿°ã®ããªã·ãŒãšããŠãæ€çŽ¢ã¢ã«ãŽãªãºã ãæå®ãã - ãã±ãŒã«äŸåãªãããã©ãŒãããè§£æãªãã®é«éãªæååã»æ°å€å€æé¢æ°ãšããŠã
to_chars()ãšfrom_chars()ã远å char_traitsã¯ã©ã¹ãconstexprã«å¯Ÿå¿- ãã€ãããŒã¿ã衚ã
byteåã远å
䞊è¡åŠç
- ã¿ã€ã ã¢ãŠãæ©èœããªãReaders-writer lockã®ãã¥ãŒããã¯ã¹ãšããŠã
shared_mutexã¯ã©ã¹ã远å - ã¹ã³ãŒãä»ãããã¯ã®å¯å€åŒæ°çãšããŠã
scoped_lockã¯ã©ã¹ã远å atomicã¯ã©ã¹ã«ãæå®ãããèŠçŽ åã«å¯Ÿããã¢ãããã¯æäœãããã¯ããªãŒ(éãã¥ãŒããã¯ã¹)ã«æ¯ãèãããå€å®ããããã«is_always_lock_free宿°ã远å- false sharingãštrue sharingãå¶åŸ¡ããããã®æ©èœãšããŠã
hardware_destructive_interference_size宿°ãšãhardware_constructive_interference_size宿°ã远å
ã¹ããŒããã€ã³ã¿
shared_ptrãé åã«å¯Ÿå¿shared_ptrã¯ã©ã¹ã«ãæå®ãããèŠçŽ åã®weak_ptråã衚ãweak_typeã¡ã³ãåã远åshared_ptr::use_count()ã®ä»æ§ãæç¢ºåshared_from_thisã®æãå ãæžãæãããªãããšãèŠå®-
é åç
unique_ptrã®å倿ãšããŠã以äžã®ã³ãŒããäžé©æ Œã ã£ãïŒstd::unique_ptr<Foo const * const []> ptr1(new Foo*[10]); Foo const * ptr = ptr1[9];- ãã®ãããªã³ãŒãã驿 Œã«ãªãããã倿ã³ã³ã¹ãã©ã¯ã¿ãšå€æä»£å ¥æŒç®åã远å
-
unique_ptrã®ãã³ãã¬ãŒãä»£å ¥æŒç®åã«ãäžè¶³ããŠããSFINAEã«ãŒã«ã远å owner_lessã§ãä»»æã®èŠçŽ åãæã€shared_ptråå£«ãæ¯èŒã§ããããã«ãã
æ°åŠ
<cmath>ã«æ°åŠã®ç¹æ®é¢æ°ã远åhypot()颿°ã®3åŒæ°çã远å- æå€§å
¬çŽæ°ãšæå°å
¬åæ°ã®é¢æ°ãšããŠã
gcd()ãšlcm()ã远å
ã¿ãã«
- ã¿ãã«ãå±éããŠé¢æ°åŒã³åºããã
apply()颿°ã远å - ã¿ãã«ãä»»æã®åã®ãªããžã§ã¯ãã«å€æãã
make_from_tuple()颿°ã远å -
åæååãªã¹ããã
pairãštupleãæ§ç¯ããããããããã®æ¹åãšããŠã以äžã®ã³ãŒãã驿 Œã«ãªãããã³ã³ã¹ãã©ã¯ã¿ã®ä»æ§ã調æŽïŒstd::tuple<int, int> pixel_coordinates() { return {10, -15}; // ã³ã³ãã€ã«ãšã©ãŒ } struct NonCopyable { NonCopyable(int); NonCopyable(const NonCopyable&) = delete; }; std::pair<NonCopyable, double> pmd{42, 3.14}; // C++14ã§ã¯ã³ã³ãã€ã«ãšã©ãŒ // C++17ã§ã¯OK
åç¹æ§
- å€ãè¿ãåç¹æ§ã¯ã©ã¹ã®
constexpr倿°ãã³ãã¬ãŒãçã远å ã倿°ãã³ãã¬ãŒãçã¯ãæ«å°Ÿã«_vãä»ããvã¯value(å€) ãæå³ãã - åç¹æ§ã¯ã©ã¹ãå®çŸ©ããããããããã«ã
void_tã远å bool宿°ã衚ãbool_constantã远å- ã³ã³ãã€ã«ææ¡ä»¶ã®è«çæŒç®ã®ããã«ãè«çç©ã§ãã
conjunctionãè«çåã§ããdisjunctionãåŠå®ã§ããnegationã远å swapå¯èœããå€å®ããåç¹æ§ã¯ã©ã¹ãšããŠãis_swappable_withãis_swappableãis_nothrow_swappable_withãis_nothrow_swappableã远å- 颿°ãåŒã³åºãå¯èœããå€å®ããåç¹æ§ãšããŠã
is_invocableãis_invocable_rãis_nothrow_invocableãis_nothrow_invocable_rã远å - èªåçã«ããã·ã¥å€ãæ±ããããåããå€å®ããããã«
has_unique_object_representationsåç¹æ§ã远å invoke()ã®è¿œå ã«ãšããªãã颿°ã®æ»ãå€åãååŸããåç¹æ§invoke_resultã远å ããããŸã§ã®result_ofãšéã£ãŠé¢æ°åã®ãã³ãã¬ãŒãåŒæ°ã䜿çšããªããããããã«ãã£ãŠèµ·ãã£ãŠããåä»ãªåé¡ãåé¿ãã
æéæŒç®
durationã®äžžãæŒç®ãšããŠãåãäžããããfloor()ãåãäžããããceil()ãæè¿æ¥å¶æ°ãžã®äžžããããround()ã絶察å€ãæ±ããabs()ã远åtime_pointã®äžžãæŒç®ãšããŠãåãäžããããfloor()ãåãäžããããceil()ãæè¿æ¥å¶æ°ãžã®äžžããããround()ã远ådurationã¯ã©ã¹ãštime_pointã¯ã©ã¹ã®å€æŽæäœãconstexprã«å¯Ÿå¿
ä¹±æ°
- ã©ã³ãã ãµã³ããªã³ã°ã¢ã«ãŽãªãºã ãšããŠã
sample()ã远å - ä¹±æ°çšèªã倿Žãä¹±æ°çæåšã®èŠä»¶ã« ãURNG (Uniform Random Number Generator, äžæ§ä¹±æ°çæåš)ããšããçšèªã䜿çšããŠããããäžè¬çãªURNGã®çšèªãšã¯ç°ãªããC++ã®ä¹±æ°çæåšã¯äžåºŠã®åŒã³åºãã§ã(32ããããè¶ ãããããª) ããå€ãã®ããããåäžã®ç¬Šå·ãªãæŽæ°ã«ããã¯ããŠè¿ããšããåäœãèš±å¯ãããŠãããåäœã®èª€è§£ãé¿ããããã«ããURBG (Uniform Random Bit Generator)ããšããçšèªã«å€æŽãã
ãšã©ãŒãã³ããªã³ã°
- çŸåšçºçããŠããäŸå€ã®æ°ãååŸãã
uncaught_exceptions()颿°ã远å
åãæ±ºã
std+ æ°åã®åå空éãäºçŽãC++ã®ä»åŸã®ããŒãžã§ã³ã¢ããã§æšæºã©ã€ãã©ãªã«å€§ããªå€æŽãå ãããšãã®ããã«ããstd+ æ°åã (æ£èŠè¡šçŸã§ã¯std\d*) ã®åå空éãäºçŽããã
æ©èœã®åé€
- C++11ããéæšå¥šã ã£ãå€ãã¹ããŒããã€ã³ã¿ã§ãã
auto_ptrãåé€ã代ããã«shared_ptrãunique_ptrã䜿çšããããš - C++14ããéæšå¥šã ã£ãé
åãã©ã³ãã ã«å
¥ãæ¿ãã
random_shuffle()颿°ãåé€ã代ããã«shuffle()ã䜿çšããããš - C++11ããéæšå¥šã ã£ã
throwããŒã¯ãŒãã«ããå€ãäŸå€ä»æ§ã«é¢é£ããã以äžã®ã©ã€ãã©ãªæ©èœãåé€ããunexpected()set_unexpected()get_unexpected()unexpected_handlernoexceptã«ããäŸå€ä»æ§ã§ã¯ãäŸå€ãéåºããªãã¯ãã®é¢æ°ããäŸå€ãéåºãããå Žåãterminate()颿°ã«ãã£ãŠå³åº§ã«ããã°ã©ã ãç°åžžçµäºãããããæ³å®ãããŠããªãäŸå€ãéåºãããå Žåã®ãã³ããªã³ã°ã¯æ©èœããªã
- C++11ããéæšå¥šã ã£ãå€ã
<functional>ã®æ©èœãåé€- åŒæ°ãæçžãã
bind1st()颿°ãbind2nd()颿°ãbinder1stã¯ã©ã¹ãbinder2ndã¯ã©ã¹ãåé€ã代ããã«bind()颿°ãã©ã ãåŒã䜿çšããããš - 颿°ãã€ã³ã¿ãã颿°ãªããžã§ã¯ãã«å€æããããã®
ptr_fun()颿°ãpointer_to_unary_functionã¯ã©ã¹ãpointer_to_binary_functionã¯ã©ã¹ãåé€ãfirst_argument_typeãsecond_argument_typeãšãã£ãåãå¿ èŠãªããªã£ãããããããã®æ©èœã¯å¿ èŠãªããªã£ã - ã¡ã³ã颿°ãã颿°ãªããžã§ã¯ããžã®å€æãããããã®
mem_fun()颿°ãmem_fun_ref()颿°ãmem_fun_tã¯ã©ã¹ãmem_fun1_tã¯ã©ã¹ãmem_fun_ref_tã¯ã©ã¹ãmem_fun1_ref_tã¯ã©ã¹ãconst_mem_fun_tã¯ã©ã¹ãconst_mem_fun1_tã¯ã©ã¹ãconst_mem_fun_ref_tã¯ã©ã¹ãconst_mem_fun1_ref_tã¯ã©ã¹ãåé€ã代ããã«mem_fn()ãbind()颿°ãã©ã ãåŒã䜿çšããããš
- åŒæ°ãæçžãã
functionã¯ã©ã¹ã®ã¢ãã±ãŒã¿ãµããŒããåé€ãã³ã³ãã€ã©ãå®è£ ããŠããªãã£ãããäžå®å šãªå®è£ ã ã£ããããŠãã- C++98ããéæšå¥šã ã£ãiostreamã®ãšã€ãªã¢ã¹ãåé€
ios_base::io_stateã®ä»£ããã«ios_base::iostateã䜿çšããããšios_base::open_modeã®ä»£ããã«ios_base::openmodeã䜿çšããããšios_base::seek_dirã®ä»£ããã«ios_base::seekdirã䜿çšããããšios_base::streamoffã®ä»£ããã«ãchar_traits<CharT>::off_typeãããã¯basic_ios<CharT>::off_typeã䜿çšããããš (<iosfwd>ã§å®çŸ©ãããŠããstd::streamoffã¯æ®ã)ios_base::streamposã®ä»£ããã«ãchar_traits<CharT>::pos_typeãããã¯basic_ios<CharT>::pos_typeã䜿çšããããš (<iosfwd>ã§å®çŸ©ãããŠããstd::streamposã¯æ®ã)basic_streambuf::stossc()ã¡ã³ã颿°ãåé€ãsbumpc()ã®åãªãå¥åios_baseã¯ã©ã¹ã®å¥ååãåé€ãããããšã«ãšããªãããããã®åããã©ã¡ãŒã¿ã«ãšããªãŒããŒããŒããåé€ios_baseã¯ã©ã¹ã®å¥ååãåé€ãããããšã«ãšããªãããããã®åããã©ã¡ãŒã¿ã«ãšã颿°ãåé€
æ©èœã®éæšå¥šå
std::iteratorã¯ã©ã¹ãéæšå¥šåããã®ã¯ã©ã¹ã䜿çšããŠããã€ãã¬ãŒã¿å®çŸ©ã¯ç°¡åã«ãªããªãã£ã- C++11ã§
allocator_traitsã¯ã©ã¹ãå°å ¥ãããããšã§äžèŠã«ãªã£ããallocatorã®ä»¥äžã®ã¡ã³ããéæšå¥šåïŒsize_typeådifference_typeåpointeråconst_pointeråreferenceåconst_referenceårebindåaddress()ã¡ã³ã颿°allocate()ã¡ã³ã颿°ã®hintãã©ã¡ãŒã¿max_size()ã¡ã³ã颿°construct()ã¡ã³ã颿°destroy()ã¡ã³ã颿°
- C++11ã§
allocator_traitsã¯ã©ã¹ãå°å ¥ãããããšã§äžèŠã«ãªã£ããèŠçŽ åãåæçžããããã®allocator<void>ç¹æ®åãéæšå¥šå constexprã®æ©èœæ¡åŒµã«ãã£ãŠæ±ããåãå¢ããŠãããå°æ¥çã«ã»ãšãã©ã®åãconstexprã§æ±ããããã«ãªããããconstexprã§æ±ããåã®åé¡ã§ããis_literal_typeåç¹æ§ãéæšå¥šå- äžæçãªã¡ã¢ãªç¢ºä¿ã®ããã®
std::get_temporary_buffer()颿°ãšstd::return_temporary_buffer()颿°ãéæšå¥šåããããã¯é¢æ°å ã§ã®äžæçãªã¡ã¢ãªç¢ºä¿ã®ããã«ãæé©åãããã¡ã¢ãªç¢ºä¿ã®ä»çµã¿ãæäŸããããšãæåŸ ããŠå®çŸ©ãããããå®éã«ã¯ã©ã®å®è£ ãç¹å¥èŠãããããããã«äŸ¿å©ã«äœ¿ãããŠã¯ããªãã£ããå°æ¥çã«ã¹ã¿ãã¯ããã®ã¡ã¢ãªç¢ºä¿ãããæ©èœãäœãäºå®ã ãããããã®é¢æ°ã¯äŸå€å®å šæ§ãRAIIãèæ ®ãããŠããªãããããããã®é¢æ°ã®å®è£ ã»ä»æ§ã®ã¿ãå ¥ãæ¿ãããããªæ¹èšã¯ã§ããªã raw_storage_iteratorã¯ã©ã¹ãéæšå¥šåãã¢ãã±ãŒã¿ãšã®é£æºãã§ãããéãããçšéã«ãã䜿çšã§ããªãã£ãnot_fn()ã®è¿œå ã«ãšããªããå€ããªã£ã以äžã®æ©èœãéæšå¥šåïŒnot1()颿°not2()颿°unary_negateã¯ã©ã¹binary_negateã¯ã©ã¹- æšæºé¢æ°ãªããžã§ã¯ãã®
result_typeãargument_typeãfirst_argument_typeãsecond_argument_typeå
- ãããã°çšéã«ãã䜿çšããªãã
shared_ptr::unique()ãéæšå¥šå result_ofãéæšå¥šåã代ããã«invoke_resultã䜿çšããããš<codecvt>ãšé¢é£ããæ©èœãéæšå¥šåãé©åãªãšã©ãŒãã³ããªã³ã°ã®æ¹æ³ããªãã£ããããã»ãã¥ãªãã£äžæ»æã®å¯èœæ§ããã£ãmemory_order_consumeãäžæçã«éæšå¥šåãããã®å®çŸ©ãçŸå®ã«å³ããŠããªãããacquire/releaseãã匱ããã䜿ãã«ããããšãã£ãçç±ãããããè¯ãå®çŸ©ã«å€æŽãããŸã§ã®éãéæšå¥šãšããuncaught_exceptions()ã®è¿œå ã«ãšããªããå€ããªã£ãuncaught_exception()ãéæšå¥šå