Ê×Ò³
ѧϰ
»î¶¯
רÇø
¹¤¾ß
TVP
·¢²¼
¾«Ñ¡ÄÚÈÝ/¼¼ÊõÉçȺ/ÓŻݲúÆ·,¾¡ÔÚС³ÌÐò
Á¢¼´Ç°Íù

½â¶ÁC++¼´½«Ó­À´µÄÖØ´ó¸üУºC++20µÄËÄ´óÐÂÌØÐÔ

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 µÄ±àÒëÆ÷Ö§³Ö

ÊÊÓ¦ÐÂÌØÐÔµÄ×î¼òµ¥·½·¨ÊÇÊÔÓÃËüÃÇ¡£ÄÇô½ÓÏÂÀ´ÎÒÃǾÍÃæÁÙ×ÅÕâ¸öÎÊÌ⣺ÄÄЩ±àÒëÆ÷Ö§³Ö C++20 µÄÄÄЩÌØÐÔ£¿Ò»°ãÀ´Ëµ£¬cppreference.com/compiler_support_ÄÜÌṩÔÚºËÐÄÓïÑԺͿⷽÃæµÄ´ð°¸¡£

¼òµ¥À´Ëµ£¬È«Ð嵀 GCC¡¢Clang ºÍ EDG ±àÒëÆ÷ÄÜÌṩ¶ÔºËÐÄÓïÑÔµÄ×î¼ÑÖ§³Ö¡£´ËÍ⣬MSVC ºÍ Apple Clang ±àÒëÆ÷Ò²Ö§³ÖÐí¶à C++20 ÌØÐÔ¡£

C++20 ºËÐÄÓïÑÔÌØÕ÷¡£

¿â·½ÃæµÄÇé¿öÀàËÆ¡£GCC ÔÚ¿â·½ÃæµÄÖ§³Ö×îºÃ£¬½ÓÏÂÀ´ÊÇ Clang ºÍ MSVC ±àÒëÆ÷¡£

C++20 ¿âÌØÕ÷¡£

ÉÏÃæµÄ½Øͼ½öչʾÁ˶ÔÓ¦±í¸ñµÄÇ°ÃæÒ»²¿·Ö£¬¿ÉÒÔ¿´³öÕâЩ±àÒëÆ÷µÄ±íÏÖ²¢²»ÊǷdz£ÁîÈËÂúÒâ¡£¼´Ê¹ÄãʹÓõÄÊÇȫеıàÒëÆ÷£¬ÕâЩ±àÒëÆ÷ÈÔÈ»²»Ö§³ÖºÜ¶àÐÂÌØÐÔ¡£

ͨ³£À´Ëµ£¬ÄãÄÜÕÒµ½³¢ÊÔÕâЩÐÂÌØÐԵķ½·¨¡£ÏÂÃæÊÇÁ½¸öʾÀý£º

  • ¸ÅÄ

GCC Ö§³Ö¸ÅÄîµÄÇ°Ò»¸ö°æ±¾£»

  • std::jthread£º

GitHub ÉÏÓÐÒ»¸öʵÏֲݰ¸£¬À´×Ô Nicolai Josuttis£º

https://github.com/josuttis/jthread

¼òµ¥À´Ëµ£¬ÎÊÌâûÓÐÄÇôÑÏÖØ¡£Ö»ÐèҪһЩµ÷ÕûÐ޸ģ¬ºÜ¶àÐÂÌØÐÔ¾ÍÄܽøÐг¢ÊÔ¡£ÈçÓбØÒª£¬ÎÒ»áÌáµ½ÈçºÎ½øÐÐÕâÑùµÄÐ޸ġ£

ËÄ´óÐÂÌØÐÔ

¸ÅÄconcept£©

ʹÓÃÄ£°å½øÐÐͨÓñà³ÌµÄ¹Ø¼ü˼ÏëÊǶ¨ÒåÄÜͨ¹ý¸÷ÖÖÀàÐÍ£¨type£©Ê¹Óõĺ¯ÊýºÍÀà¡£µ«ÊÇ£¬ÔÚʵÀý»¯Ä£°åʱ¾­³£»á³öÏÖÓôíÀàÐ͵ÄÎÊÌ⣬Æä½á¹ûͨ³£ÊǼ¸Ò³ÄѶ®µÄ±¨´íÐÅÏ¢¡£

ÏÖÔÚ¸ÅÄîÀ´ÁË£¬Õâ¸öÎÊÌâ¿ÉÒÔÐÝÒÓ¡£¸ÅÄîÈÃÄãÄÜΪģ°å±àдҪÇ󣬶ø±àÒëÆ÷Ôò¿ÉÒÔ¼ì²éÕâ¸öÒªÇ󡣸ÅÄî¸ïÐÂÁËÎÒÃÇ˼¿¼ºÍ±àдͨÓôúÂëµÄ·½Ê½¡£Ô­ÒòÈçÏ£º

  • Ä£°åµÄÒªÇóÊǽӿڵÄÒ»²¿·Ö£»
  • ÀàÄ£°åÖеĺ¯ÊýÖØÔØ»òÌØÊ⻯¿ÉÒÔ»ùÓÚ¸ÅÄî½øÐУ»
  • ÒòΪ±àÒëÆ÷Äܹ»±È½ÏÄ£°å²ÎÊýµÄÒªÇóÓëʵ¼ÊµÄÄ£°å²ÎÊý£¬ËùÒÔÄܵõ½¸üºÃµÄ±¨´íÐÅÏ¢¡£

µ«ÊÇ£¬Õ⻹²»ÊÇÈ«²¿¡£

  • Äã¿ÉÒÔʹÓÃÔ¤¶¨ÒåµÄ¸ÅÄҲ¿ÉÒÔ¶¨ÒåÄã×Ô¼ºµÄ¸ÅÄ
  • auto ºÍ¸ÅÄîµÄÓ÷¨Í³Ò»µ½ÁËÒ»Æð¡£Äã¿ÉÒÔ²»Ê¹Óà auto£¬¶øÊÇʹÓøÅÄ
  • Èç¹ûÒ»¸öº¯ÊýÉùÃ÷ʹÓÃÁËÒ»¸ö¸ÅÄÄÇôËü»á×Ô¶¯±ä³ÉÒ»¸öº¯ÊýÄ£°å¡£ÓÉ´Ë£¬±àдº¯ÊýÄ£°å¾Í±äµÃÓë±àдº¯ÊýÒ»Ñù¼òµ¥¡£

ÏÂÃæµÄ´úÂëƬ¶ÎչʾÁËÒ»¸ö¼òµ¥¸ÅÄî Integral µÄ¶¨ÒåºÍʹÓ÷½Ê½£º

´úÂëÓïÑÔ£ºjavascript
¸´ÖÆ
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 Ëã·¨µÈЧ£º

´úÂëÓïÑÔ£ºjavascript
¸´ÖÆ
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£©¡£

´úÂë¿ÉÄܱÈÓïÑÔÃèÊö¸üÇå³þ¡£ÏÂÃæµÄº¯ÊýÓÃÊúÏß·ûºÅչʾÁ˺¯Êý×é³É£º

´úÂëÓïÑÔ£ºjavascript
¸´ÖÆ
#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 ¶à¸öº¯Êý¹¹³É£¬ÆäÖÐÒ»²¿·ÖÐèÒªÄãȥʵÏÖ£¬ÁíÒ»²¿·ÖÔò¿ÉÄÜÐèÒªÖØд¡£Òò´Ë£¬Äã¿ÉÒÔ¸ù¾ÝÐèÇóµ÷ÕûЭ³Ì¡£

ÏÂÃæչʾÁËÒ»¸öÌض¨Ð­³ÌµÄÓ÷¨¡£ÏÂÃæµÄ³ÌÐòʹÓÃÁËÒ»¸öÄܲúÉúÎÞÏÞÊý¾ÝÁ÷µÄÉú³ÉÆ÷£º

´úÂëÓïÑÔ£ºjavascript
¸´ÖÆ
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£©

Ä£¿é²¿·Ö¼òµ¥½éÉÜһϾͺá£Ä£¿é³ÐŵÄܹ»ÊµÏÖ£º

  • ¸ü¿ìµÄ±àÒëʱ¼ä£»
  • ºêµÄ¸ôÀ룻
  • ±í´ï´úÂëµÄÂß¼­½á¹¹£»
  • ²»±ØÔÙʹÓÃÍ·Îļþ£¨header file£©£»
  • °ÚÍѳóªµÄºê·½·¨¡£
  • ·¢±íÓÚ:
  • Ô­ÎÄÁ´½Ó£ºhttp://news.51cto.com/art/202001/609200.htm
  • ÈçÓÐÇÖȨ£¬ÇëÁªÏµ cloudcommunity@tencent.com ɾ³ý¡£

ɨÂë

Ìí¼ÓÕ¾³¤ ½ø½»Á÷Ⱥ

ÁìȡרÊô 10ÔªÎÞÃż÷ȯ

˽Ïí×îР¼¼Êõ¸É»õ

ɨÂë¼ÓÈ뿪·¢ÕßÉçȺ
Áìȯ
http://www.vxiaotou.com