C++20£¨C++ ±à³ÌÓïÑÔ±ê×¼ 2020 °æ£©½«ÊÇ C++ ÓïÑÔÒ»´Î·Ç³£ÖØ´óµÄ¸üУ¬½«ÎªÕâÃÅÓïÑÔÒýÈë´óÁ¿ÐÂÌØÐÔ¡£½üÈÕ£¬C++ ¿ª·¢Õß Rainer Grimm Õýͨ¹ýһϵÁв©¿ÍÎÄÕ½éÉÜ C++20 µÄÐÂÌØÐÔ¡£Ä¿Ç°Õâ¸öϵÁÐÎÄÕÂÒѾ¸üÐÂÁËÁ½Æª£¬±¾ÆªÊǵÚһƪ£¬Ö÷Òª½éÉÜÁË C++20 µÄ Big Four£¨ËÄ´óÐÂÌØÐÔ£º¸ÅÄî¡¢·¶Î§¡¢Ð³ÌºÍÄ£¿é£©ÒÔ¼°ºËÐÄÓïÑÔ£¨°üÀ¨Ò»Ð©ÐµÄÔËËã·ûºÍָʾ·û£©¡£
C++20 Óкܶà¸üУ¬ÉÏͼչʾÁË C++20 ¸üеĸſö¡£ÏÂÃæ×÷ÕßÊ×ÏȽéÉÜ ÁË C++20 µÄ±àÒëÆ÷Ö§³ÖÇé¿ö£¬È»ºó½éÉÜ The Big Four£¨ËÄ´óÐÂÌØÐÔ£©ÒÔ¼°ºËÐÄÓïÑÔ·½ÃæµÄÐÂÌØÐÔ¡£
ÊÊÓ¦ÐÂÌØÐÔµÄ×î¼òµ¥·½·¨ÊÇÊÔÓÃËüÃÇ¡£ÄÇô½ÓÏÂÀ´ÎÒÃǾÍÃæÁÙ×ÅÕâ¸öÎÊÌ⣺ÄÄЩ±àÒëÆ÷Ö§³Ö C++20 µÄÄÄЩÌØÐÔ£¿Ò»°ãÀ´Ëµ£¬cppreference.com/compiler_support_ÄÜÌṩÔÚºËÐÄÓïÑԺͿⷽÃæµÄ´ð°¸¡£
¼òµ¥À´Ëµ£¬È«Ð嵀 GCC¡¢Clang ºÍ EDG ±àÒëÆ÷ÄÜÌṩ¶ÔºËÐÄÓïÑÔµÄ×î¼ÑÖ§³Ö¡£´ËÍ⣬MSVC ºÍ Apple Clang ±àÒëÆ÷Ò²Ö§³ÖÐí¶à C++20 ÌØÐÔ¡£
C++20 ºËÐÄÓïÑÔÌØÕ÷¡£
¿â·½ÃæµÄÇé¿öÀàËÆ¡£GCC ÔÚ¿â·½ÃæµÄÖ§³Ö×îºÃ£¬½ÓÏÂÀ´ÊÇ Clang ºÍ MSVC ±àÒëÆ÷¡£
C++20 ¿âÌØÕ÷¡£
ÉÏÃæµÄ½Øͼ½öչʾÁ˶ÔÓ¦±í¸ñµÄÇ°ÃæÒ»²¿·Ö£¬¿ÉÒÔ¿´³öÕâЩ±àÒëÆ÷µÄ±íÏÖ²¢²»ÊǷdz£ÁîÈËÂúÒâ¡£¼´Ê¹ÄãʹÓõÄÊÇȫеıàÒëÆ÷£¬ÕâЩ±àÒëÆ÷ÈÔÈ»²»Ö§³ÖºÜ¶àÐÂÌØÐÔ¡£
ͨ³£À´Ëµ£¬ÄãÄÜÕÒµ½³¢ÊÔÕâЩÐÂÌØÐԵķ½·¨¡£ÏÂÃæÊÇÁ½¸öʾÀý£º
GCC Ö§³Ö¸ÅÄîµÄÇ°Ò»¸ö°æ±¾£»
GitHub ÉÏÓÐÒ»¸öʵÏֲݰ¸£¬À´×Ô Nicolai Josuttis£º
https://github.com/josuttis/jthread
¼òµ¥À´Ëµ£¬ÎÊÌâûÓÐÄÇôÑÏÖØ¡£Ö»ÐèҪһЩµ÷ÕûÐ޸ģ¬ºÜ¶àÐÂÌØÐÔ¾ÍÄܽøÐг¢ÊÔ¡£ÈçÓбØÒª£¬ÎÒ»áÌáµ½ÈçºÎ½øÐÐÕâÑùµÄÐ޸ġ£
¸ÅÄconcept£©
ʹÓÃÄ£°å½øÐÐͨÓñà³ÌµÄ¹Ø¼ü˼ÏëÊǶ¨ÒåÄÜͨ¹ý¸÷ÖÖÀàÐÍ£¨type£©Ê¹Óõĺ¯ÊýºÍÀà¡£µ«ÊÇ£¬ÔÚʵÀý»¯Ä£°åʱ¾³£»á³öÏÖÓôíÀàÐ͵ÄÎÊÌ⣬Æä½á¹ûͨ³£ÊǼ¸Ò³ÄѶ®µÄ±¨´íÐÅÏ¢¡£
ÏÖÔÚ¸ÅÄîÀ´ÁË£¬Õâ¸öÎÊÌâ¿ÉÒÔÐÝÒÓ¡£¸ÅÄîÈÃÄãÄÜΪģ°å±àдҪÇ󣬶ø±àÒëÆ÷Ôò¿ÉÒÔ¼ì²éÕâ¸öÒªÇ󡣸ÅÄî¸ïÐÂÁËÎÒÃÇ˼¿¼ºÍ±àдͨÓôúÂëµÄ·½Ê½¡£ÔÒòÈçÏ£º
µ«ÊÇ£¬Õ⻹²»ÊÇÈ«²¿¡£
ÏÂÃæµÄ´úÂëƬ¶ÎչʾÁËÒ»¸ö¼òµ¥¸ÅÄî Integral µÄ¶¨ÒåºÍʹÓ÷½Ê½£º
template<typename?T>?concept?bool?Integral(){?????return?std::is_integral<T>::value;?}??Integral?auto?gcd(Integral?auto?a,????????????????????????Integral?auto?b){?????if(?b?==?0?)?return?a;??????else?return?gcd(b,?a?%?b);?}?
Integral Õâ¸ö¸ÅÄîÐèÒª std::is_integral<T>::value ÖеÄÀàÐͲÎÊý T¡£std::is_integral<T>::value Õâ¸öº¯ÊýÀ´×Ô type-traits ¿â£¬ËüÄÜÔÚ T ΪÕûÊý¼ì²é±àÒëʱ¼ä¡£Èç¹û std::is_integral<T>::value µÄֵΪ true£¬ÔòûÓÐÎÊÌâ¡£Èç¹û²»Îª true£¬ÔòÄã»áÊÕµ½Ò»¸ö±àÒëʱ¼ä±¨´í¡£Èç¹ûÄãºÜºÃÆ棨ÄãÒ²Ó¦¸ÃºÃÆ棩£¬ÎÒµÄÕâƪÎÄÕ½éÉÜÁË type-traits ¿â£ºhttps://www.modernescpp.com/index.php/tag/type-traits¡£
gcd Ëã·¨ÊÇ»ùÓÚÅ·¼¸ÀïµÂË㷨ȷ¶¨×î´ó¹«Ô¼Êý£¨greatest common divisor£©¡£ÎÒʹÓÃÁËÕâ¸öËõдº¯ÊýÄ£°å¾ä·¨À´¶¨Òå gcd¡£gcd ÒªÇóÆä²ÎÊýºÍ·µ»ØÀàÐÍÖ§³Ö¸ÅÄî Integral¡£gcd ÊÇÒ»Àà¶Ô²ÎÊýºÍ·µ»ØÖµ¶¼ÓÐÒªÇóµÄº¯ÊýÄ£°å¡£µ±ÎÒɾ³ýÕâ¸ö¾ä·¨ÌÇ£¨syntactic sugar£©Ê±£¬Ò²ÐíÄãÄÜ¿´µ½ gcd µÄÕæÕý±¾ÖÊ¡£
ÏÂÃæÕâ¶Î´úÂëÔÚÓïÒåÉÏÓë gcd Ëã·¨µÈЧ£º
template<typename?T>??requires?Integral<T>()??T?gcd(T?a,?T?b){??????if(?b?==?0?)?return?a;???????else?return?gcd(b,?a?%?b);??}?
Èç¹ûÄ㻹û¿´µ½ gcd µÄÕæÕý±¾ÖÊ£¬¹ý¼¸ÖÜÎÒ»¹»áרÃÅ·¢²¼Ò»Æª½éÉܸÅÄîµÄÎÄÕ¡£
·¶Î§¿â£¨Ranges Library£©
·¶Î§¿âÊǸÅÄîµÄÊ׸ö¿Í»§¡£ËüÖ§³ÖµÄËã·¨Âú×ãÒÔÏÂÌõ¼þ£º
¿ÉÒÔÖ±½ÓÔÚÈÝÆ÷ÉϲÙ×÷£»ÎÞÐèµü´úÆ÷Ö¸¶¨Ò»¸ö·¶Î§£»
¿ÉÒÔ¿íËɵØÆÀ¹À£»
¿ÉÒÔ×éºÏ¡£
¼òµ¥À´Ëµ£º·¶Î§¿âÖ§³Öº¯Êýģʽ£¨functional patterns£©¡£
´úÂë¿ÉÄܱÈÓïÑÔÃèÊö¸üÇå³þ¡£ÏÂÃæµÄº¯ÊýÓÃÊúÏß·ûºÅչʾÁ˺¯Êý×é³É£º
#include?<vector>??#include?<ranges>??#include?<iostream>??int?main(){????std::vector<int>?ints{0,?1,?2,?3,?4,?5};????auto?even?=?[](int?i){?return?0?==?i?%?2;?};????auto?square?=?[](int?i)?{?return?i?*?i;?};????for?(int?i?:?ints?|?std::view::filter(even)?|?????????????????????????std::view::transform(square))?{??????std::cout?<<?i?<<?'?';?????????????//?0?4?16????}??}?
even ÊÇÒ»¸ö lambda º¯Êý£¬ÆäÔÚ i ΪżÊýʱ·µ»Ø£»lambda º¯Êý square Ôò»á½« i Ó³ÉäΪËüµÄƽ·½¡£ÆäÓàµÄ±ØÐë´Ó×óµ½ÓÒ¶ÁÈ¡µÄµÚ i ¸öº¯Êý×é³É£ºfor (int i : ints | std::view::filter(even) | std::view::transform(square)). ½«¹ýÂËÆ÷ even Ó¦ÓÃÓÚ ints µÄÿ¸öÔªËØ£¬È»ºó½«ÆäÓàµÄÿ¸öÔªËØÓ³ÉäΪËüÃǵÄƽ·½¡£Èç¹ûÄãÊìϤº¯Êý±à³Ì£¬ÄÇôÕâ¶ÁÆðÀ´¾ÍÏñһƪɢÎÄÊ«¡£
г̣¨Coroutines£©
гÌÊǹãÒåµÄº¯Êý£¬ÄÜÔÚ±£³Ö״̬µÄͬʱÔÝÍ£»ò¼ÌÐø¡£Ð³Ìͨ³£ÓÃÀ´±àдʼþÇý¶¯ÐÍÓ¦Óá£Ê¼þÇý¶¯ÐÍÓ¦ÓÿÉÒÔÊÇÄ£Äâ¡¢ÓÎÏ·¡¢·þÎñÆ÷¡¢Óû§½Ó¿Ú»òËã·¨¡£Ð³ÌҲͨ³£±»ÓÃÓÚÐ×÷ʽ¶àÈÎÎñ£¨cooperative multitasking£©¡£
ÎÒÃÇÕâÀï²»½éÉÜ C++20 µÄ¾ßÌåг̣¬¶ø»á½éÉܱàдг̵Ŀò¼Ü¡£±àдг̵Ŀò¼ÜÓÉ 20 ¶à¸öº¯Êý¹¹³É£¬ÆäÖÐÒ»²¿·ÖÐèÒªÄãȥʵÏÖ£¬ÁíÒ»²¿·ÖÔò¿ÉÄÜÐèÒªÖØд¡£Òò´Ë£¬Äã¿ÉÒÔ¸ù¾ÝÐèÇóµ÷Õûг̡£
ÏÂÃæչʾÁËÒ»¸öÌض¨Ð³ÌµÄÓ÷¨¡£ÏÂÃæµÄ³ÌÐòʹÓÃÁËÒ»¸öÄܲúÉúÎÞÏÞÊý¾ÝÁ÷µÄÉú³ÉÆ÷£º
Generator<int>?getNext(int?start?=?0,?int?step?=?1){??????auto?value?=?start;??????for?(int?i?=?0;;?++i){??????????co_yield?value;????????????//?1??????????value?+=?step;??????}??}??int?main()?{??????std::cout?<<?std::endl;??????std::cout?<<?"getNext():";??????auto?gen?=?getNext();??????for?(int?i?=?0;?i?<=?10;?++i)?{??????????gen.next();???????????????//?2??????????std::cout?<<?"?"?<<?gen.getValue();????????????????????????}??????std::cout?<<?"nn";??????std::cout?<<?"getNext(100,?-10):";??????auto?gen2?=?getNext(100,?-10);??????for?(int?i?=?0;?i?<=?20;?++i)?{??????????gen2.next();?????????????//?3??????????std::cout?<<?"?"?<<?gen2.getValue();??????}??????std::cout?<<?std::endl;??}?
±ØÐë²¹³ä¼¸¾ä¡£Õâ¶Î´úÂëÖ»ÊÇÒ»¸ö´úÂë¶Î¡£º¯Êý getNext ÊÇÒ»¸öг̣¬ÒòΪËüʹÓÃÁ˹ؼü×Ö co_yield¡£getNext ÓÐÒ»¸öÎÞÏÞµÄÑ»·£¬Æä»áÔÚ co_yield Ö®ºó·µ»Ø value¡£µ÷Óà next()£¨×¢Ê굀 µÚ 2¡¢3 ÐУ©»á¼ÌÐøÕâ¸öг̣¬½ÓÏÂÀ´µÄ getValue µ÷Óûá»ñÈ¡Õâ¸öÖµ¡£ÔÚ getNext µ÷ÓÃÖ®ºó£¬Õâ¸öгÌÔÙÒ»´ÎÔÝÍ£¡£ÆäÔÝÍ£»áÒ»Ö±³ÖÐøµ½ÏÂÒ»´Îµ÷Óà next()¡£ÎÒµÄÕâ¸öʾÀýÖÐÓÐÒ»¸öºÜ´óµÄδ֪£¬¼´ getNext º¯ÊýµÄ·µ»ØÖµ Generator<int>¡£Õⲿ·ÖÄÚÈݺܸ´ÔÓ£¬ºóÃæÎÒÔÚдг̵ÄÎÄÕÂÖиüÏêϸµØ½éÉÜ¡£
ʹÓà Wandbox ÔÚÏß±àÒëÆ÷£¬ÎÒ¿ÉÒÔÏòÄãչʾÕâ¸ö³ÌÐòµÄÊä³ö£º
Ä£¿é£¨Module£©
Ä£¿é²¿·Ö¼òµ¥½éÉÜһϾͺá£Ä£¿é³ÐŵÄܹ»ÊµÏÖ£º
ÁìȡרÊô 10ÔªÎÞÃż÷ȯ
˽Ïí×îР¼¼Êõ¸É»õ