æŠèŠ
C++20ãšã¯ã2020幎äžã«æ¹èšãããISO/IEC 14882:2020ã§æšæºèŠæ ŒåãããC++ããŒãžã§ã³ã®éç§°ã§ããã
ãã®ããŒãžã§ã³ã¯ãçå®äžã¯C++2aãšåŒã°ããããšããã£ããã202a幎ã«ãªãªãŒã¹ãããããšããäŒãåãšããŠãaãã䜿ãããŠãããã3å¹Žåšæã«æ¬¡ã®ããŒãžã§ã³ãçå®ãããããšã決ãŸã£ãŠãããããäŒãåã«ãªã£ãŠãã幎æ°ããããããšã¯ãªãã
èšèªæ©èœ
ã¯ã©ã¹
| èšèªæ©èœ | 説æ |
|---|---|
<=>/==ã«ããæ¯èŒæŒç®åã®èªåå®çŸ© |
äžæ¹æ¯èŒæŒç®åã«ãã£ãŠæ¯èŒæŒç®åã®èªåçæãè¡ãããã«ãã |
| ããããã£ãŒã«ãã®ã¡ã³ã倿°åæå | ããããã£ãŒã«ãã¡ã³ã倿°ã®ããã©ã«ãå€ãèšå®ããæ§æã远å ãã |
颿°ãæ¡ä»¶ä»ãã§explicitã«ããæ§æã远å |
explicit(true)ã®ããã«explicitã«ççå€ãã©ã¡ãŒã¿ãæå®ã§ããããã«ãã |
const修食ãããã¡ã³ããã€ã³ã¿ã®å¶éãä¿®æ£ |
.*æŒç®åã§ã®å·ŠèŸºå€ã®constã¡ã³ã颿°åŒã³åºããèš±å¯ãã |
ããã©ã«ãã®ã³ããŒã³ã³ã¹ãã©ã¯ã¿ãšéconstãªã³ã³ã¹ãã©ã¯ã¿ãè¡çªããåé¡ãä¿®æ£ |
éconstãªãªããžã§ã¯ãããšãã³ã³ã¹ãã©ã¯ã¿ãå®çŸ©ãããšããã®ã¯ã©ã¹ãã©ããããã¯ã©ã¹ã®ã³ããŒã³ã³ã¹ãã©ã¯ã¿ãäžé©æ Œã«ãªã£ãŠããŸãåé¡ãä¿®æ£ |
| ç¹æ®åã®ã¢ã¯ã»ã¹ãã§ã㯠| |
空ãªããžã§ã¯ãã«å¯Ÿããæé©åãæ¯æŽãã屿§[[no_unique_address]] |
[[no_unique_address]]屿§ãå°å
¥ãã空ã®åã®ãªããžã§ã¯ããã»ãã®ãªããžã§ã¯ããšå
±æããæé©åãèš±å¯ãã |
| friendæå®ããã颿°å ããæ§é åæçžã䜿çšããŠéå ¬éã¡ã³ã倿°ã«ã¢ã¯ã»ã¹ããããšãèš±å¯ | æ§é åæçžã®ä»æ§ãšããŠå ¬éã¡ã³ã倿°ã®ã¿ãåãåºããããã«ãªã£ãŠããããfriendæå®ããã颿°ããã¯éå ¬éã¡ã³ã倿°ã«ãã¢ã¯ã»ã¹ã§ããããã«ãã |
| æ§é åæçžãã«ã¹ã¿ãã€ãŒãŒã·ã§ã³ãã€ã³ããèŠã€ããã«ãŒã«ãç·©å | éãã³ãã¬ãŒãã®get()ã¡ã³ã颿°ãèŠã€ãã£ãå Žåã¯ãéã¡ã³ã颿°ã®get()ãæ¢ãã«ãã |
| æœè±¡åã®ãã§ã㯠| 颿°ã®å®£è𿮵éã§ã¯ããã©ã¡ãŒã¿ããã³æ»ãå€åãæœè±¡åãã©ããããã§ãã¯ããªãããã«ãã |
å¯å€é·ããŒã¿ãæ±ãã¯ã©ã¹ã®å¹ççãªdelete |
ã¯ã©ã¹ã®deleteæŒç®åãåŒã³åºãããåã«ãã¹ãã©ã¯ã¿ãåŒã°ããªãããã«ãããªãã·ã§ã³ã远å |
| æ¡ä»¶ä»ãã§ç¹æ®ã¡ã³ã颿°ãããªãã¢ã«ã«å®çŸ©ããããã« | å¶çŽã«ãã£ãŠããªãã¢ã«ãªç¹æ®ã¡ã³ã颿°ãšéããªãã¢ã«ãªç¹æ®ã¡ã³ã颿°ããªãŒããŒããŒãã§ããããã«ãã |
| æªåæåé åãžã®æé»çãªãªããžã§ã¯ãæ§ç¯ | æªåæåé åã®å©çšæã«èªåçã«ããªãã¢ã«ãªåã®ãªããžã§ã¯ããæ§ç¯ãã |
åæå
| èšèªæ©èœ | 説æ |
|---|---|
| ã¹ã³ãŒãä»ãåæåã®usingå®£èš | using enum EnumType;ãããã¯using EnumType::enumeratorãšããããšã§ãåæå€ã®ã¹ã³ãŒãæå®ãçç¥ã§ããããã«ãã |
倿°
| èšèªæ©èœ | 説æ |
|---|---|
| æç€ºä»ãåæå | æ³¢ã«ãã³ã«ããéæäœåæåã§ã¡ã³ãåãæå®ããŠåæåã§ããããã«ãã |
| æ§é åæçžãæ¡åŒµããŠéåžžã®å€æ°å®£èšã®ããã«äœ¿çšã§ããããã«ãã | èšæ¶åæå®åãšããŠstaticãšthread_localã®æå®ãèš±å¯ |
| äžžã«ãã³ã®å€ãªã¹ãããã®éæäœåæåãèš±å¯ | T x{1, 2, 3};ãšåæ§ã«T x(1, 2, 3);ã§ãéæäœåæåã§ããããã«ãã |
newåŒã§ã®é
åèŠçŽ æ°ã®æšè« |
double* p = new double[]{1,2,3};ãèš±å¯ |
| èŠçŽ æ°äžæã®é åãžã®å€æãèš±å¯ | èŠçŽ æ°ã倿ããŠããé åãããèŠçŽ æ°ãäžæã®é åãžã®å€æãèš±å¯ |
ãã€ã³ã¿ããboolãžã®å€æãçž®å°å€æãšãã |
ãã€ã³ã¿ããboolå€ãžã®å€æãçž®å°å€æãšèŠå®ããããšã§ãæå³ããªã倿ã鲿¢ãã |
æŽæ°
| èšèªæ©èœ | 説æ |
|---|---|
| 笊å·ä»ãæŽæ°åã2ã®è£æ°è¡šçŸã§ããããšãèŠå® | 笊å·ä»ãæŽæ°åã®ããã衚çŸã2ã®è£æ°ã«èŠå®ãã |
æåå
| èšèªæ©èœ | 説æ |
|---|---|
UTF-8ãšã³ã³ãŒãã£ã³ã°ãããæåã®åãšããŠchar8_tã远å |
UTF-8ãšã³ã³ãŒããããæåãã©ããã§ãªãŒããŒããŒãã»ç¹æ®åãã§ããããã«ãã |
char16_tãšchar32_tã®æåã»æååãªãã©ã«ããæåã³ãŒãUTF-16/32ã«èŠå® |
__STDC_UTF_16__ã__STDC_UTF_32__ã®å®çŸ©ã«é¢ä¿ãªããchar16_tãchar32_tã®ãªãã©ã«ãUTF-16/32æåã³ãŒãã«èŠå®ãã |
颿°
| èšèªæ©èœ | 説æ |
|---|---|
[[nodiscard]]屿§ã«çç±ãšãªãæååãä»å ã§ããããã«ãã |
颿°ã®æ»ãå€ãç¡èŠããŠã¯ãªããªãçç±ã颿°å®£èšã«æãããèŠåã¡ãã»ãŒãžã«åœ¹ç«ãŠã |
[[nodiscard]]ãã³ã³ã¹ãã©ã¯ã¿ã®ãªãŒããŒããŒãããšã«ä»å ã§ããããã«ãã |
ãªãœãŒã¹ç¢ºä¿ããã³ã³ã¹ãã©ã¯ã¿ã«ã®ã¿[[nodiscard]]ãä»å ã§ããããã«ãã |
å¶åŸ¡æ§æ
| èšèªæ©èœ | 説æ |
|---|---|
| åæååŒããšããªãç¯å²foræ | ç¯å²foræã¹ã³ãŒãã§äœ¿çšãã倿°ã®åæåã®ããã®æ§æã远å |
| ç¯å²foræãã«ã¹ã¿ãã€ãŒãŒã·ã§ã³ãã€ã³ããèŠã€ããã«ãŒã«ãç·©å | begin()/end()ã¡ã³ã颿°ã®ã©ã¡ãããèŠã€ãããªãã£ãå Žåã«éã¡ã³ã颿°ã®begin()/end()ãæ¢ãã«ãã |
確çãé«ãåå²ãšäœãåå²ãäŒãã屿§ [[likely]], [[unlikely]] |
æ¡ä»¶åå²ã®æé©åãã³ããäžãã屿§ |
ãã³ãã¬ãŒã
| èšèªæ©èœ | 説æ |
|---|---|
| ã³ã³ã»ãã | ãã³ãã¬ãŒããã©ã¡ãŒã¿ã«å¯Ÿããå¶çŽãè¡ã |
| autoãã©ã¡ãŒã¿ã«ãã颿°ãã³ãã¬ãŒãã®ç°¡æå®çŸ© | ãžã§ããªãã¯ã©ã ããšåæ§ã颿°ãã©ã¡ãŒã¿ã®åãautoã«ããããšã§ç°¡æçã«é¢æ°ãã³ãã¬ãŒããå®çŸ©ã§ããããã«ãã |
åã®æèã§typenameã®çç¥ãèš±å¯ |
åããçŸããªãæèã§ã¯ãäŸååã解決ããããã®typenameããŒã¯ãŒããçç¥ã§ããããã«ãã |
| éåãã³ãã¬ãŒããã©ã¡ãŒã¿ãšããŠã¯ã©ã¹åãèš±å¯ãã | 宿°åŒãšããŠäœ¿çšã§ããåãåºãéåãã³ãã¬ãŒããã©ã¡ãŒã¿ãšããŠäœ¿çšã§ããããã«ãã |
| 颿°ãã³ãã¬ãŒãã«æç€ºçã«åæå®ããå Žåã«ADLã§èŠã€ãããªãåé¡ãä¿®æ£ | åå空éå ã®é¢æ°ãã³ãã¬ãŒãããã³ãã¬ãŒãåŒæ°æå®ãã€é修食ã»ADLã§æ£ããåŒã³åºããããä¿®æ£ |
| éæäœã¯ã©ã¹ãã³ãã¬ãŒãã®ãã³ãã¬ãŒãåŒæ°æšè« | ã¯ã©ã¹ãã³ãã¬ãŒãã®ãã³ãã¬ãŒãåŒæ°æšè«ã¯ã³ã³ã¹ãã©ã¯ã¿åŒæ°ããæšè«ãããããéæäœåæåãããæšè«ã§ããããã«ãã |
| ãšã€ãªã¢ã¹ãã³ãã¬ãŒãçµç±ã§ã®ã¯ã©ã¹ãã³ãã¬ãŒãã®ãã³ãã¬ãŒãåŒæ°æšè« | ãšã€ãªã¢ã¹ãã³ãã¬ãŒãããã¯ã©ã¹ãã³ãã¬ãŒãã®ãã³ãã¬ãŒãåŒæ°ãæšè«ã§ããããã«ãã |
宿°åŒ
| èšèªæ©èœ | 説æ |
|---|---|
| è©äŸ¡ãããªãæèã§ã®å®æ°åŒè©äŸ¡ã«ãã£ãŠç¹æ®ã¡ã³ã颿°ãã€ã³ã¹ã¿ã³ã¹åãããããšãèŠå® | sizeofãdecltypeãªã©ã®è©äŸ¡ãããªãæèã«ãããŠå®æ°åŒè©äŸ¡ãè¡ã£ãå Žåã«ãã ãŒãã³ã³ã¹ãã©ã¯ã¿ã®ãããªç¹æ®ã¡ã³ã颿°ãå®çŸ©ãããããšãèŠå® |
| 宿°åŒããã®ä»®æ³é¢æ°ã®åŒã³åºããèš±å¯ | ä»®æ³é¢æ°ã«constexprãä»ããããªãå¶éãè§£é€ |
宿°åŒã§ã®dynamic_castã倿
çãªtypeidãèš±å¯ |
宿°åŒã§ã®åç倿 ãèš±å¯ |
| constexpr颿°å ã§ã®try-catchãããã¯ãèš±å¯ | constexpr颿°å
ã§try-catchãããã¯ãæžããããã«ãã |
åžžã«å®æ°åŒè©äŸ¡ããconsteval |
constevalããŒã¯ãŒãã远å ããåžžã«å®æ°åŒè©äŸ¡ãããããæå®ã§ããããã«ãã |
| 宿°åŒå ã§ã®å ±çšäœã®ã¢ã¯ãã£ãã¡ã³ãã®å€æŽãèš±å¯ | å ±çšäœã¡ã³ãã®æžãæãã宿°åŒå ã§è¡ããããã«ãã |
| constexpr颿°å ã§ã®ããªãã¢ã«ãªããã©ã«ãåæåãèš±å¯ | constexpr颿°å ã§ã®ããã©ã«ãåæåãèš±å¯ããæªåæåå€ãèªãããšã®ã¿çŠæ¢ãã |
| constexpr颿°å ã§æªè©äŸ¡ã®ã€ã³ã©ã€ã³ã¢ã»ã³ããªãèš±å¯ããããšã«ããçµã¿èŸŒã¿é¢æ°ã®constexpræå¹å | ã³ã³ãã€ã«æã«è©äŸ¡ãããªãå Žåã«constexpr颿°ã«asmå®çŸ©ãå«ããããšãèš±å¯ |
ã³ã³ãã€ã«æåæåã匷å¶ããconstinitããŒã¯ãŒãã远å |
åæåã®ã¿ã³ã³ãã€ã«æã«ããããããå Žåã«äœ¿çšãã |
å¯å€ãµã€ãºããã€ã³ã³ããã®constexprå |
constexprèšæ¶åããã€ã¡ã¢ãªã¢ãã±ãŒã¿ã®ååšãèæ
®ããããšã§ãå¯å€ãµã€ãºããã€ã³ã³ãããã³ã³ãã€ã«æã«äœ¿çšã§ããããã«ãã |
ã©ã ãåŒ
| èšèªæ©èœ | 説æ |
|---|---|
| ãžã§ããªãã¯ã©ã ãã®ãã³ãã¬ãŒãæ§æ | ãžã§ããªãã¯ã©ã ãã§ãã³ãã¬ãŒããã©ã¡ãŒã¿ãå®çŸ©ã§ããããã«ãã |
ã©ã ãåŒã®ãã£ããã£ãšããŠ[=, this]ãèš±å¯ãã |
ããã©ã«ãã³ããŒãã£ããã£ãšthisãã€ã³ã¿ã®ã³ããŒãã£ããã£ãäž¡æ¹æå®ã§ããããã«ãã |
| æé»ã®ã©ã ããã£ããã£ãç°¡ç¥å | ã©ã ãåŒã®ãã£ããã£ã«é¢ãã仿§æŽç |
| ç¶æ ãæããªãã©ã ãåŒããããã©ã«ãæ§ç¯å¯èœãä»£å ¥å¯èœãšãã | ãã£ããã£ããŠããªãã©ã ãåŒãããã©ã«ãæ§ç¯ã»ä»£å ¥å¯èœã«ãã |
| è©äŸ¡ãããªãæèã§ã®ã©ã ãåŒ | è©äŸ¡ãããªãæèã§ãã©ã ãåŒãæžãããšãã§ããããã«ãã |
| ã©ã ãåŒã®åæåãã£ããã£ã§ã®ããã¯å±éãèš±å¯ | [...args = std::move(args)]ã®ãããªãã£ããã£ãèš±å¯ |
| æ§é åæçžãã倿°ã®åç §ãã£ããã£ãèš±å¯ | æ§é åæçžããã倿°ã¯ç¹æ®ãªæ±ãã®ããã©ã ãåŒã§åç §ãã£ããã£ã§ããªãèŠå®ãšãªã£ãŠããããããèš±å¯ãã |
åå空é
| èšèªæ©èœ | 説æ |
|---|---|
| å ¥ãååå空éå®çŸ©ã§ã®ã€ã³ã©ã€ã³åå空é | namespace ns1::inline ns2::ns3 {}ã®ããã«ãå
¥ãååå空éãå®çŸ©ããåŒã«ã€ã³ã©ã€ã³åå空éã®æå®ãå«ããããããã«ãã |
ã¢ãžã¥ãŒã«å
| èšèªæ©èœ | 説æ |
|---|---|
| ã¢ãžã¥ãŒã« | ããããã¡ã€ã«ã»ãœãŒã¹ãã¡ã€ã«ãã€ã³ã¯ã«ãŒãã«å€ããä»çµã¿ãšããŠã¢ãžã¥ãŒã«ãå°å ¥ãã |
䞊è¡ã»äžŠååŠç
| èšèªæ©èœ | 説æ |
|---|---|
| ã³ã«ãŒãã³ | 颿°å®è¡ãäžæã»åéããä»çµã¿ãšããŠã³ã«ãŒãã³ãå°å ¥ãã |
ããªããã»ããµ
| èšèªæ©èœ | 説æ |
|---|---|
| å¯å€åŒæ°ã空ã§ãªãå Žåã®ããŒã¯ã³çœ®æ | ããªããã»ããµã®çœ®æã§å¯å€åŒæ°ã空ã®å Žåã«äœèšãªã«ã³ããä»ããŠããŸãåé¡ã«å¯ŸåŠ |
æ©èœã®éæšå¥šå
| èšèªæ©èœ | 説æ |
|---|---|
ã»ãšãã©ã®volatileãéæšå¥šå |
volatileã®æçšãªæ©èœã®ã¿ãæ®ãã广ãçãããããŸãã¯å£ããŠããæ©èœãéæšå¥šåãã |
| PODãéæšå¥šå | PODãšããçšèªãéæšå¥šåãã |
[=]ã«ããthisã®æé»ã®ãã£ããã£ãéæšå¥šå |
ã³ããŒã®ããã©ã«ããã£ããã£ã§ã¯ãthisãã€ã³ã¿ã®ãã£ããã£ãéæšå¥šåãã |
| æ·»åæŒç®åå ã§ã®ã«ã³ãæŒç®åã®äœ¿çšãéæšå¥šå | ar[i, j]ãéæšå¥šåãar[(i, j)]ã¯OK |
| åæå€ããç®è¡åãžã®æé»å€æãéæšå¥šå | åæå€ãžã®ç®è¡æŒç®ã§ç®è¡åã«æé»å€æããã仿§ãéæšå¥šãšãã |
| çµã¿èŸŒã¿é åã®æ¯èŒãéæšå¥šå | çµã¿èŸŒã¿é ååå£«ã®æ¯èŒæŒç®ãéæšå¥šãšãã |
æ©èœã®åé€
| èšèªæ©èœ | 説æ |
|---|---|
throw()ã«ããäŸå€éåºããªãæå®ãåé€ |
代ããã«noexceptã䜿çšããããš |
| ãŠãŒã¶ãŒå®£èšããã³ã³ã¹ãã©ã¯ã¿ãæã€ã¯ã©ã¹ã®éæäœåæåãçŠæ¢ | ã³ã³ã¹ãã©ã¯ã¿ãdeleteïŒdefault宣èšãããŠããã¯ã©ã¹ããéæäœåæåã«ãã£ãŠã³ã³ã¹ãã©ã¯ã¿åŒã³åºããåé¿ããŠæ§ç¯ã§ããŠããŸã£ãŠããææ³ãçŠæ¢ |
å°ããªå€æŽ
| èšèªæ©èœ | 説æ |
|---|---|
| æŽæ°ãããå®çŸ©æžã¿ãã¯ã | æšæºèŠæ Œã§å®çŸ©ããããã¯ãã®æŽæ° |
| Unicodeæšæºãžã®åç §ãæŽæ° | æšæºC++ããISO/IEC 10646ãžã®åç §ãæŽæ°ãã |
| 屿§ã®åå空éãäºçŽ | å°æ¥ã®äœ¿çšã®ããã«å±æ§ã®åå空éãäºçŽ |
ã©ã€ãã©ãªæŽæ°ã®æŠèŠ
æ°ã©ã€ãã©ãª
- ããŒãžã§ã³æ
å ±ã©ã€ãã©ãªãšããŠ
<version>ã远å ãããã§ã¯ãå®è£ äŸåã®æ å ± (ããŒãžã§ã³ããªãªãŒã¹æ¥ä»ãªã©) ãæšæºã©ã€ãã©ãªã®å®è£ ã«ãã£ãŠå®çŸ©ããã <chrono>ã©ã€ãã©ãªã«ãã«ã¬ã³ããŒãšã¿ã€ã ãŸãŒã³ã®æ©èœãæ¡åŒµ- ä»»æã®ã·ãŒã±ã³ã¹ã®éšåã·ãŒã±ã³ã¹ãåç
§ããã©ã€ãã©ãªãšããŠ
<span>ã远å - æååãã©ãŒãããã©ã€ãã©ãªãšããŠ
<format>ã远å - åºåã¹ããªãŒã ãåæããã©ã€ãã©ãªãšããŠ
<syncstream>ã远å - äžæ¹æ¯èŒã©ã€ãã©ãªãšããŠ
<compare>ã远å - æ°å€ã©ã€ãã©ãªãšããŠ
<numbers>ã远å ãæ°åŠå®æ°ãå®çŸ©ããã - ãããæäœã©ã€ãã©ãªãšããŠ
<bit>ã远å- Strict AliasingèŠåã«æµè§Šããªããããã¬ãã«ã®åè§£éãã£ã¹ãã§ãã
std::bit_cast()颿°ã远å - 1ãããã ãç«ã£ãŠããå€ããã£ãŠããããå€å®ãã
std::has_single_bit()颿°ã远å - æŽæ°å€ã2ã®çޝä¹å€ã«åãäžãã
std::bit_ceil()颿°ãæŽæ°å€ã2ã®çޝä¹å€ã«åãäžããstd::bit_floor()颿°ã远å - å€ã衚çŸããããã«å¿
èŠãªãããå¹
ãæ±ãã
std::bit_width()颿°ã远å - 埪ç°ãããã·ãããè¡ã
std::rotl()ãšstd::rotr()ã远å - é£ç¶ãã0ãããã¯1ã®ããããæ°ãã
std::countl_zero()ãstd::countl_one()ãstd::countr_zero()ãstd::countr_one()ãããã³ç«ã£ãŠããããããæ°ããstd::popcount()ã远å - ãšã³ãã£ã¢ã³ã衚ãåæåãšããŠ
std::endianã远å
- Strict AliasingèŠåã«æµè§Šããªããããã¬ãã«ã®åè§£éãã£ã¹ãã§ãã
- åå¶çŽã®ããã®èŠä»¶ã©ã€ãã©ãªãšããŠ
<concepts>ã远å - èšèªæ©èœã§ããã³ã«ãŒãã³ãå¶åŸ¡ããã©ã€ãã©ãªãšããŠ
<coroutine>ã远å - ã¹ã¬ããã®å®è¡ã忢ãããã¡ã«ããºã ãšããŠ
<stop_token>ã远å ãã忢ã«å¯Ÿå¿ããã¹ã¬ããã¯ã©ã¹ãšããŠ<thread>ã«std::jthreadã¯ã©ã¹ã远å - 軜éãªåæããªããã£ãã§ããã»ããã©ã®ã©ã€ãã©ãªãšããŠ
<semaphore>ã远å - ã¹ã¬ãã調æŽã¡ã«ããºã ãšããŠãã©ããã©ã€ãã©ãªã®
<latch>ãããªã¢ã©ã€ãã©ãªã®<barrier>ã远å - ã€ãã¬ãŒã¿ã®çµã§ã¯ãªããã³ã³ãããé
åãéšåçãªã³ã³ãããªã©ãæ±ãç¯å²ã©ã€ãã©ãªãšããŠ
<ranges>ã远å- æ¢åã®ã€ãã¬ãŒã¿ã®çµãæ±ãã¢ã«ãŽãªãºã ã¯ã
std::rangesåå空éã«ç¯å²çã¢ã«ãŽãªãºã ã远å ããã
- æ¢åã®ã€ãã¬ãŒã¿ã®çµãæ±ãã¢ã«ãŽãªãºã ã¯ã
- ãœãŒã¹ã³ãŒãã®äœçœ®ãååŸããã©ã€ãã©ãªãšããŠ
<source_location>ã远å
åãæ±ºã
stdåå空é以äžã®é¢æ°ãã³ãã¬ãŒãããŠãŒã¶ãŒãç¹æ®åããããšãçŠæ¢ãã (åç § : P0551R3)
ã³ã³ãã
- 飿³ã³ã³ããã«ãèŠçŽ ãã³ã³ããã«å«ãŸããŠããããå€å®ãã
contains()ã¡ã³ã颿°ã远å - é åºä»ã飿³ã³ã³ãããšåæ§ã«ãéé åºé£æ³ã³ã³ããã®æ€çŽ¢åŠçã§ãäžæãªããžã§ã¯ããçæãããã³ã¹ããæããæ¡åŒµã远å ãããŒç倿¯èŒãè¡ã颿°ãªããžã§ã¯ããšããã·ã¥èšç®ãè¡ã颿°ãªããžã§ã¯ãã®äž¡æ¹ã«
is_transparentãå®çŸ©ãããŠããã°ãééçãªæ€çŽ¢ã䜿çšã§ãããstd::hashã¯ã©ã¹ã®ããŒãžãåç § - åã³ã³ããã®éã¡ã³ã颿°ãšããŠãèŠçŽ ãåé€ãã
std::erase()颿°ãšstd::erase_if()颿°ã远å std::forward_listãšstd::listã®ã¡ã³ã颿°remove()ãremove_if()ãunique()ã®æ»ãå€åããvoidããContainer::size_typeã«å€æŽstd::arrayã¯ã©ã¹ã®æ¯èŒæŒç®åãfill()ã¡ã³ã颿°ãswap()ã¡ã³ã颿°ãswap()éã¡ã³ã颿°ã«constexprã远å ããã®ã¯ã©ã¹ã®ã¡ã³ã颿°ã¯ãã¹ãŠconstexprã«å¯Ÿå¿ãã- çµã¿èŸŒã¿é
åã
std::arrayã«å€æãã颿°ãšããŠstd::to_array()ã远å <iterator>ã«ã笊å·ä»ãæŽæ°ãšããŠã³ã³ããã®èŠçŽ æ°ãååŸããstd::ssize()颿°ã远åstd::allocatorãããã³std::vectorãšstd::basic_stringãconstexpr察å¿
ã¢ã«ãŽãªãºã
<algorithm>ã®å€ãã®é¢æ°ã«constexprã远å<algorithm>ã«ãèŠçŽ äœçœ®ãã·ããããstd::shift_left()ãstd::shift_right()ã远å<algorithm>ã«äžæ¹æ¯èŒã«ããèŸæžé æ¯èŒã¢ã«ãŽãªãºãstd::lexicographical_compare_three_way()ã远å- æ°å€ãšãã€ã³ã¿ã®äžç¹ãæ±ãã颿°ãšããŠã
<numeric>ã«std::midpoint()颿°ã远å - æµ®åå°æ°ç¹æ°ãç·åœ¢è£éãã颿°ãšããŠã
<cmath>ã«std::lerp()颿°ã远å <numeric>ã®æ°å€èšç®ã¢ã«ãŽãªãºã ãã ãŒãã«å¯Ÿå¿<numeric>ã®æ°å€èšç®ã¢ã«ãŽãªãºã ã«constexprã远å
ã€ãã¬ãŒã¿
std::back_insert_iteratorã¯ã©ã¹ãstd::front_insert_iteratorã¯ã©ã¹ãstd::insert_iteratorã¯ã©ã¹ã®ã³ã³ã¹ãã©ã¯ã¿ãä»£å ¥æŒç®åã鿥åç §æŒç®åãã€ã³ã¯ãªã¡ã³ãæŒç®åãããã³std::back_inserter()ãstd::front_inserter()ãstd::inserter()ã«constexprã远å ããããã®ã¯ã©ã¹ã®ã¡ã³ã颿°ã¯ãã¹ãŠconstexprã«å¯Ÿå¿ãã
颿°ãªããžã§ã¯ã
std::reference_wrapperã¯ã©ã¹ãstd::ref()颿°ãstd::cref()颿°ã®ãã³ãã¬ãŒããã©ã¡ãŒã¿Tåã«äžå®å šåãæå®ããããšãèš±å¯- ã¡ã³ã颿°ã®éšåé©çšãç°¡åã«ããããã«ããã¬ãŒã¹ãã«ããŒã®æå®ãªãåŒæ°ãå
é ããé ã«æçžãã
std::bind_front()颿°ã远å std::invoke()ãstd::reference_wrapperã®åæäœãstd::not_fn()ãstd::bind()ãstd::mem_fn()ãconstexpr察å¿- ã³ã³ã»ããã®å°å
¥ã«ãšããªãã
<functional>ã«ãåãåã£ãå€ããã®ãŸãŸè¿ã颿°ãªããžã§ã¯ãstd::identityã远å
æåå
std::basic_stringã¯ã©ã¹ãšstd::basic_string_viewã¯ã©ã¹ã«ãå é ã®éšåæååãå€å®ããstarts_with()ã¡ã³ã颿°ãæ«å°Ÿã®éšåæååãå€å®ããends_with()ã¡ã³ã颿°ã远åstd::basic_string::reserve()ã¡ã³ã颿°ã®ãã¡ã¢ãªã®çž®å°æ©èœãåé€ãã䌞é·ã®ã¿ãšãããstd::char_traitsã¯ã©ã¹ã®move()ãcopy()ãassign()éçã¡ã³ã颿°ã«constexprã远å
䞊è¡ã»äžŠååŠç
std::atomicã¯ã©ã¹ãšstd::atomic_flagã¯ã©ã¹ã®ããã©ã«ãã³ã³ã¹ãã©ã¯ã¿ããå€åæåããããåäœå€æŽããããŸã§ã¯Cèšèªãšã®äºææ§ã®ããã«æªåæåãšãªã£ãŠãã<memory>ã«ãstd::atomicã¯ã©ã¹ã®std::shared_ptrãšstd::weak_ptrã«å¯Ÿããç¹æ®åã远åstd::atomicã¯ã©ã¹ã®æµ®åå°æ°ç¹æ°åã«å¯Ÿããç¹æ®åã远å- ã¢ãããã¯ã¯ã©ã¹ã«å¯Ÿããããããã³ã°åæã®æ©èœãšããŠ
wait()ãnotify_one()ãnotify_all()ã远å - ããã¯ããªãŒã§ããããšãä¿èšŒãããã¢ãããã¯æŽæ°åã®å¥åãšããŠ
atomic_signed_lock_freeãšatomic_unsigned_lock_freeã远å std::memory_orderã®åæåã«ã¹ã³ãŒããããããstd::atomic_flagã¯ã©ã¹ã«ãboolå€ãèªã¿èŸŒãã¡ã³ã颿°test()ã远å- éã¢ãããã¯ãªãªããžã§ã¯ãã«ã¢ãããã¯æäœãé©çšããããã®ã¯ã©ã¹
std::atomic_refã远å - ãã¯ãã«åã®å®è¡ããªã·ãŒãšããŠã
<execution>ã«std::execution::unsequenced_policyåãšstd::execution::unseqã¿ã°ã远å
å ¥åºå
- åæã¹ããªãŒã ã®è¿œå ã«ãšããªã£ãŠã
<ostream>ã«ãåæã¹ããªãŒã é¢ä¿ã®åºåãããã¥ã¬ãŒã¿ã远å operator>>(basic_istream&, CharT*)ãoperator>>(basic_istream&, CharT (&)[N])ã«ä¿®æ£operator<<ã«ãwchar_t(charçã®ã¿)ãchar8_tãchar16_tãchar32_tã®delete宣èšã远åstd::istream_iteratorã«ã€ããŠãèŠä»¶ã®æžãæ¹ãæŽçããæ¯ãèããããæç¢ºåstd::basic_stringbufãstd::basic_istringstreamãstd::basic_ostringstreamã¯ã©ã¹ã«ãã¢ãã±ãŒã¿ãäŒæãããããã®ã€ã³ã¿ãã§ãŒã¹ã远å
ã¹ããŒããã€ã³ã¿
std::make_shared()ãšstd::allocate_shared()ãé åã«å¯Ÿå¿- ã¹ããŒããã€ã³ã¿ãããã©ã«ãåæåã§æ§ç¯ãããã«ã颿°ãšããŠã
std::make_unique_for_overwrite()ãstd::make_shared_for_overwrite()ãstd::allocate_shared_for_overwrite()ã远å - ãã€ã³ã¿ãçãã€ã³ã¿ã«å€æãã
std::to_address()ã远å std::pointer_traits::pointer_to()颿°ã«constexprã远å
ã¡ã¢ãª
<memory>ã«ãNãã€ãã¢ã©ã€ã¡ã³ãããããã€ã³ã¿ã§ããããšãã³ã³ãã€ã©ã«äŒããstd::assume_aligned()颿°ã远å<memory>ã«ãuses allocatoræ§ç¯ããµããŒããããŠãŒãã£ãªãã£é¢æ°ãšããŠãstd::uses_allocator_construction_args()ãstd::make_obj_using_allocator()ãstd::uninitialized_construct_using_allocator()ã远åstd::pmr::polymorphic_allocatorã«ã以äžã®å€æŽã远å ïŒ- ã¯ã©ã¹ãã³ãã¬ãŒãã®ããã©ã«ããã³ãã¬ãŒãåŒæ°ã
std::byteåãšãã void*ã®ãã€ãåãã¡ã¢ãªç¢ºä¿ããallocate_bytes()ãè§£æŸããdeallocate_bytes()ã¡ã³ã颿°ã远å- æå®ããåã®ã¡ã¢ãªã確ä¿ãã
allocate_object()ãè§£æŸããdeallocate_object()ã远å - æå®ããåã®ã¡ã¢ãªç¢ºä¿ãšæ§ç¯ããã
new_object()ãç Žæ£ãšè§£æŸãããdelete_object()ã远å
- ã¯ã©ã¹ãã³ãã¬ãŒãã®ããã©ã«ããã³ãã¬ãŒãåŒæ°ã
ãŠãŒãã£ãªãã£
<utility>ã«ã笊å·ä»ãæŽæ°ãšç¬Šå·ãªãæŽæ°ã®å®å šãªæ¯èŒé¢æ°ãšããŠã以äžã远å ïŒstd::swap()颿°ã«constexprã远åstd::exchange()颿°ã«constexprã远åstd::complexã¯ã©ã¹ãconstexprã«å¯Ÿå¿std::pairã¯ã©ã¹ã®ã³ã³ã¹ãã©ã¯ã¿ãä»£å ¥æŒç®åãswap()ã¡ã³ã颿°ãswap()éã¡ã³ã颿°ã«constexprã远å ããã®ã¯ã©ã¹ã®ã¡ã³ã颿°ã¯ãã¹ãŠconstexprã«å¯Ÿå¿ããstd::tupleã¯ã©ã¹ã®ã³ã³ã¹ãã©ã¯ã¿ãä»£å ¥æŒç®åãswap()ã¡ã³ã颿°ãswap()éã¡ã³ã颿°ã«constexprã远å ããã®ã¯ã©ã¹ã®ã¡ã³ã颿°ã¯ãã¹ãŠconstexprã«å¯Ÿå¿ãã
ãã¡ã€ã«ã·ã¹ãã
std::filesystem::create_directory()ãšstd::filesystem::create_directories()ã®ä»æ§ãçŽæçã§ã¯ãªãããã§ã«ãã£ã¬ã¯ããªãååšããŠããå Žåã«ãšã©ãŒãšãªã£ãŠãããC++20ã§ã¯ãã®ç¶æ³ã§ã¯ãšã©ãŒã«ãªããªãããã«ãã (ãšã©ãŒã§ã¯ãªãfalseãè¿ã)
åç¹æ§
<type_traits>ã«ãconstexpr颿°ã宿°åŒè©äŸ¡ãããããå€å®ããç¹æ®ãªé¢æ°std::is_constant_evaluated()ã远å<type_traits>ã«ãåã®CV修食ãšåç §ãé€å»ããåç¹æ§ã¯ã©ã¹ãšããŠstd::remove_cvrefã远å<type_traits>ã«ãåãåã£ãåããã®ãŸãŸè¿ãstd::type_identityã远å<type_traits>ã«ãäŸå€éåºããã«æé»ã®å倿ãå¯èœããå€å®ããstd::is_nothrow_convertibleã远å<type_traits>ã«ãèŠçŽ æ°ã倿ããŠããé ååããå€å®ããstd::is_bounded_arrayãèŠçŽ æ°ãäžæãªé ååããå€å®ããstd::is_unbounded_arrayã远å<type_traits>ã«ãã¬ã€ã¢ãŠãäºææ§ããã€ã³ã¿çžäºäº€æå¯èœæ§ãå€å®ãã以äžã®åç¹æ§ã远å ïŒ- 2ã€ã®åã«ã¬ã€ã¢ãŠãäºæãããããå€å®ãã
std::is_layout_compatible - 2ã€ã®ã¡ã³ããã€ã³ã¿ãäºæãªå
±éäœçœ®ã«ããããå€å®ãã
std::is_corresponding_member() - åºåºã¯ã©ã¹ãšæŽŸçã¯ã©ã¹ã®éã§ãã€ã³ã¿çžäºäº€æå¯èœããå€å®ãã
std::is_pointer_interconvertible_base_of - ã¡ã³ããã€ã³ã¿ãšã¯ã©ã¹ã®éã§ãã€ã³ã¿çžäºäº€æå¯èœããå€å®ãã
is_pointer_interconvertible_with_class()
- 2ã€ã®åã«ã¬ã€ã¢ãŠãäºæãããããå€å®ãã
<type_traits>ã«ãstd::reference_wrapper<T>åãT&åã«å±éããstd::unwrap_referenceåç¹æ§ãstd::decay+std::reference_wrapper<T>åã®å±éãããstd::unwrap_ref_decayåç¹æ§ã远å
æ©èœã®éæšå¥šå
- äžè²«æ¯èŒæ©èœã«ãã£ãŠæ¯èŒæŒç®åã®å®çŸ©ã容æã«ãªã£ããããäžèŠã«ãªã£ãæŒç®åã®ç°¡æœå®çŸ©æ©èœã§ãã
std::rel_opsãéæšå¥šå std::basic_string::reserve()ã¡ã³ã颿°ããã¡ã¢ãªã®çž®å°ãããªããªã£ããããããã©ã«ãåŒæ°0ãéæšå¥šåstd::atomicã¯ã©ã¹ãšstd::atomic_flagã¯ã©ã¹ã®ããã©ã«ãã³ã³ã¹ãã©ã¯ã¿ãå€åæåããããã«ãªã£ããããäžèŠã«ãªã£ã以äžã®ã¢ãããã¯ãªããžã§ã¯ãã®åæåæ©èœãéæšå¥šåïŒstd::atomic_init()颿°ATOMIC_VAR_INITãã¯ã
std::shared_ptrã®std::atomicç¹æ®å远å ã«ãšããªããstd::shared_ptrã«å¯Ÿãã以äžã®ã¢ãããã¯æäœãéæšå¥šåïŒstd::atomic_is_lock_freestd::atomic_loadstd::atomic_load_explicitstd::atomic_storestd::atomic_store_explicitstd::atomic_exchangestd::atomic_exchange_explicitstd::atomic_compare_exchange_weakstd::atomic_compare_exchange_strongstd::atomic_compare_exchange_weak_explicitstd::atomic_compare_exchange_strong_explicit
æ©èœã®åé€
- C++11ã§
allocator_traitsã¯ã©ã¹ãå°å ¥ãããããšã§C++17ããéæšå¥šåãããŠãããallocatorã®ä»¥äžã®ã¡ã³ããåé€ããªããsize_typeåãšdifference_typeåã®éæšå¥šã¯åãæ¶ããããpointeråconst_pointeråreferenceåconst_referenceårebindåaddress()ã¡ã³ã颿°allocate()ã¡ã³ã颿°ã®hintãã©ã¡ãŒã¿max_size()ã¡ã³ã颿°construct()ã¡ã³ã颿°destroy()ã¡ã³ã颿°
- C++11ã§
allocator_traitsã¯ã©ã¹ãå°å ¥ãããããšã§C++17ããéæšå¥šåãããŠãããèŠçŽ åãåæçžããããã®allocator<void>ç¹æ®åãåé€ - C++17ã§éæšå¥šåãããŠããã
constexprã§æ±ããåã®åé¡ã§ããis_literal_typeåç¹æ§ãåé€ - C++17ã§éæšå¥šåãããŠãããäžæçãªã¡ã¢ãªç¢ºä¿ã®ããã®
std::get_temporary_buffer()颿°ãšstd::return_temporary_buffer()颿°ãåé€ - C++17ã§éæšå¥šåãããŠãã
raw_storage_iteratorã¯ã©ã¹ãåé€ not_fn()ã®è¿œå ã«ãšããªããC++17ããéæšå¥šåãããŠãã以äžã®æ©èœãåé€ïŒnot1()颿°not2()颿°unary_negateã¯ã©ã¹binary_negateã¯ã©ã¹- æšæºé¢æ°ãªããžã§ã¯ãã®
result_typeãargument_typeãfirst_argument_typeãsecond_argument_typeå
- C++17ããéæšå¥šåãããŠãã
shared_ptr::unique()ãåé€ invoke_resultã®è¿œå ã«ãšããªããC++17ããéæšå¥šåãããŠããresult_ofãåé€- C++17ã§ã®
uncaught_exceptions()ã®è¿œå ã«ãšããªããéæšå¥šåããŠããuncaught_exception()ãåé€ - C++17ã§éæšå¥šåãããŠããCäºæã©ã€ãã©ãª
<ccomplex>,<cstdalign>,<cstdbool>,<ctgmath>ãåé€ããŸããC++ã§ã¯ãªã«ãå®çŸ©ãããªãCäºæã©ã€ãã©ãª<ciso646>ãåé€