Кіріспе
C++11 C++ бағдарламалау тілінің 2011 жылғы басылымы - C++ бағдарламалау тіліне арналған ISO/IEC 14882 стандартының нұсқасы. C++11 C++03 деп аталатын C++ стандартының алдыңғы нұсқасын алмастырды, кейіннен оны C++14 алмастырды. Атауы тіл нұсқаларын спецификацияның жариялау жылы бойынша атау дәстүріне сәйкес келеді, бірақ ол бұрын C ++ 0x деп аталды, өйткені ол 2010 жылға дейін жарияланады деп күтілді. Дизайн мақсаттарының бірі негізгі тілге өзгерістер енгізуден гөрі кітапханаларға өзгерістер енгізуді артық көру болса да, C++11 негізгі тілге бірнеше толықтырулар енгізеді. Негізгі тілдің айтарлықтай жақсарған салаларына көптірікті қолдау, жалпы бағдарламалауды қолдау, бірыңғай инициализациялау және өнімділік кіреді. Математикалық арнайы функциялар кітапханасынан басқа, C++ техникалық баяндама 1 (TR1) кітапханаларының көпшілігін қамтитын C++ стандартты кітапханасына да елеулі өзгерістер енгізілді. C++11 2011 жылдың қыркүйегінде ISO/IEC 14882:2011 болып жарияланды және ақы төлеп қол жетімді. Жарияланған C++11 стандартына ең ұқсас жұмыс жобасы 2012 жылғы 16 қаңтардағы N3337 болып табылады; онда C++11 стандартынан редакциялық түзетулер ғана бар. C++11-ді Clang 3.3 және одан кейінгілер толық қолдайды. C++11 GCC 4.8.1 және одан кейінгі нұсқаларда толық қолдайды.
C++11 is a version of the ISO/IEC 14882 standard for the C++ programming language. C++11 replaced the prior version of the C++ standard, called C++03, and was later replaced by C++14. The name follows the tradition of naming language versions by the publication year of the specification, though it was formerly named C++0x because it was expected to be published before 2010. Although one of the design goals was to prefer changes to the libraries over changes to the core language, C++11 does make several additions to the core language. Areas of the core language that were significantly improved include multithreading support, generic programming support, uniform initialization, and performance. Significant changes were also made to the C++ Standard Library, incorporating most of the C++ Technical Report 1 (TR1) libraries, except the library of mathematical special functions. C++11 was published as ISO/IEC 14882:2011 in September 2011 and is available for a fee. The working draft most similar to the published C++11 standard is N3337, dated 16 January 2012; it has only editorial corrections from the C++11 standard. C++11 is fully supported by Clang 3.3 and later. C++11 is fully supported by GCC 4.8.1 and later.
C++ негізгі тілінің кеңейтулері
C++ комитетінің бір функциясы - тілдің өзегін әзірлеу. Негізгі тілдің айтарлықтай жақсарған салаларына көптірікті қолдау, жалпы бағдарламалауды қолдау, бірыңғай инициализациялау және өнімділік кіреді.
Негізгі тілдің орындалу уақытында өнімділікті жақсарту
Бұл тілдік ерекшеліктер негізінен орындаушылық артықшылықтарды, я есте сақтауды, я есептеу жылдамдығын қамтамасыз ету үшін қолданылады.
R-нұқылымдар мен жылжыту конструкторлары
C++03 (және одан бұрын) уақытша (олар "rvalues" деп аталады, өйткені олар көбінесе тапсырманың оң жағында орналасқан) ешқашан өзгертілмейтін болды C сияқты және const T& типтерінен ажыратылмайды деп саналды; дегенмен, кейбір жағдайларда уақытша түрлер өзгертілуі мүмкін, бұл тіпті пайдалы саңылау деп саналды. C++11 T&& арқылы анықталатын rvalue сілтемесі деп аталатын констант емес сілтеме түрін қосады. Бұл "көшіру семантикасына" рұқсат беру мақсатында бастамаланғаннан кейін өзгертуге рұқсат етілген уақытша түрлерді білдіреді. C++03 бағдарламасының тұрақты жұмыс істеу проблемасы - құндылық бойынша нысандар берілсе, ымыраға келетін қымбат және қажетсіз терең көшірмелер. Мәселені түсіндіру үшін std:: vector<T> - бұл ішкі жағынан, анықталған өлшемі бар C стилі массиві айналасында орама. Егер std::vector<T> уақытша функциядан құрылса немесе қайтарылса, оны тек жаңа std::vector<T> құру және оған барлық rvalue деректерін көшіру арқылы сақтауға болады. Содан кейін уақытша және оның барлық естеліктері жойылады. (Жайлаулы болу үшін, бұл талқылау қайтару құнын оңтайландыруды елемеді.) C++11-де std::vector<T>-ның жылжыту конструкторы std::vector<T>-ға rvalue сілтемесін алады, ол rvalue-дан жаңа std::vector<T>-ға ішкі C стилі массивіне сілтемені көшіре алады, содан кейін rvalue ішіндегі сілтемені нөлге орнатады. Уақытша ешқашан пайдаланылмайтындықтан, ешқандай код нөлдік көрсеткішке қол жеткізуге тырыспайды, ал көрсеткіші нөл болғандықтан, оның жады шектен тыс болған кезде жойылмайды. Осылайша, операция тек терең көшірме шығынын ғана емес, қауіпсіз және көрінбейтін болады. Rvalue сілтемелері стандартты кітапханадан тыс өзгерістерді енгізудің қажеті жоқ, қолданыстағы кодқа өнімділік артықшылықтарын қамтамасыз ете алады. std::vector<T> temporary функциясын қайтаратын функцияның қайтарылған мәні түрін std::vector<T> && түріне ауыстыру үшін нақты өзгертудің қажеті жоқ, өйткені уақытшалар автоматты түрде r-құндылық деп саналады. (Егер std::vector<T> - бұл жылжыту конструкторы жоқ C++03 нұсқасы болса, онда көшірме конструкторы const std::vector<T>& арқылы шақырылады, бұл едәуір жады бөлінуіне әкеледі.) Қауіпсіздік себептерімен кейбір шектеулер қойылады. Аталған айнымалы, ол осындай деп мәлімделсе де, ешқашан rvalue деп қарастырылмайды. r-нысанды алу үшін std::move функция үлгісін пайдалану керек. R-нұқылымдар белгілі бір жағдайларда ғана өзгертілуі мүмкін, олар негізінен қозғалыс конструкторларымен пайдаланылады. rvalue сілтемелерінің сөз тіркесімінің сипаты және lvalue сілтемелерінің (дәстүрлі сілтемелер) сөз тіркесімінің кейбір өзгерістеріне байланысты, rvalue сілтемелер әзірлеушілерге функцияларды толық жеткізуге мүмкіндік береді. Вариадикалық үлгілермен біріктірілгенде, бұл мүмкіндік функцияның үлгілерін осы нақты аргументтерді алатын басқа функцияға аргументтерді өте жақсы жолдай алады. Бұл конструктор параметрлерін жіберу үшін, сол нақты аргументтер үшін дұрыс конструкторды автоматты түрде шақыратын фабрика функцияларын құру үшін өте пайдалы. Бұл C++ стандартты кітапхана әдістерінің emplace back жиынтығында көрінеді.
Негізгі тілдің қолдануын жақсарту
Бұл мүмкіндіктер тілдің қолдануын жеңілдету үшін қолданылады. Бұлар типтік қауіпсіздікті арттырады, кодты қайталауды азайтады, қате кодты аз мүмкін етеді және т.б.
Ашық түрлендіру операторлары
C++98 конструкторларға нақты кілт сөзді модификатор ретінде қосты, бұл бір аргумент конструкторларын жасырын түр түрлендіру операторлары ретінде пайдаланудың алдын алу үшін. Алайда бұл нақты конверсия операторларына ешқандай әсер етпейді. Мысалы, ақылды сілтеме класында бастапқы сілтемеге ұқсауға мүмкіндік беретін bool операторы болуы мүмкін: егер ол осы түрлендіруді қамтитын болса, онда оны if (ақылды ptr айнымалысы) арқылы сынауға болады (егер сілтеме нөлдік емес болса және басқа жағдайда жалған болса, бұл дұрыс болар еді). Алайда, бұл басқа да бейқам түрлендірулерге жол береді. C++ bool арифметикалық тип ретінде анықталғандықтан, оны интегралға немесе тіпті жылжымалы нүкте типтеріне ымыраға келтіруге болады, бұл пайдаланушы көздемеген математикалық операцияларды жүргізуге мүмкіндік береді. C++11-де ашылған кілт сөзді енді түрлендіру операторларына қолдануға болады. Конструкторларға ұқсас, бұл конверсия функцияларын жасырын конверсияларда пайдалануды болдырмайды. Алайда, Бульдік мәнді қажет ететін тілдік контексттер (if нұсқауы мен циклдерінің шарттары және логикалық операторларға операндар) айқын түрлендірулер ретінде есептеледі және осылайша бульдік түрлендіру операторын пайдалана алады. Мысалы, бұл мүмкіндік қауіпсіз буль мәселесін таза шешеді.
Негізгі тілдің функционалдылығын жақсарту
Бұл мүмкіндіктер тілге бұрын мүмкін емес, өте көп сөзді немесе портативті емес кітапханалар қажет болған нәрселерді жасауға мүмкіндік береді.
Түрлі үлгілер
C++11-де үлгілер үлгінің параметрлерінің өзгермелі санын ала алады. Бұл сондай-ақ типтік қауіпсіз вариадикалық функцияларды анықтауға мүмкіндік береді.
Көптірікті жад моделі
C++11 көптірікті бағдарламалауды стандарттады. Бұл екі бөлімнен тұрады: бірнеше желілердің бағдарламада бірге болуына мүмкіндік беретін жад моделі және желілер арасындағы өзара әрекеттесуді қолдайтын кітапхана. (Бұл мақалада жіппен жұмыс істеу құрылғылары туралы бөлімді қараңыз.) Жад моделі бірнеше желілер бір жад орнына кіргенде және бір желідегі жаңартулар басқа желілерге көрінетін кезде анықталады.
Сызық-жергілікті сақтау
Көптірікті ортада әр тірілттің кейбір ерекше айнымалылары болуы әдеттегі нәрсе. Бұл функцияның жергілікті айнымалылары үшін орын алады, бірақ бұл жаһандық және статикалық айнымалылар үшін болмайды. Жаңа желілік жергілікті сақтау ұзақтығы (қазіргі статикалық, динамикалық және автоматты) сақтау спецификаторы желілік жергілікті арқылы көрсетіледі. Статикалық сақтау ұзақтығына ие болатын кез келген объектке (яғни, бағдарламаның бүкіл орындалу уақытын қамтитын өмір сүру мерзімі) оның орнына желілік жергілікті ұзақтығын беруге болады. Мақсаты - кез келген басқа статикалық ұзақтықтағы айнымалы сияқты, желілік жергілікті объект конструкторды қолдана отырып бастауыш етілуі және деструкторды қолдана отырып жойылуы мүмкін.
Жауапты түрде өшірілген функциялар
Функцияны нақты түрде өшіруге болады. Бұл жасырын түр түрлендірулерді болдырмау үшін пайдалы. = delete спецификаторы белгілі бір параметр түрлерін бар функцияларды шақыруды тыйым салу үшін пайдаланылуы мүмкін.
Қоқыс жиналған қолданбаларды рұқсат ету
Бұрынғы C++ стандарттары бағдарламалық қамсыздандыру арқылы қоқыс жинауды қамтамасыз етті, бірақ автоматты қоқыс жинау мақсатында объектінің қол жетімділігін анықтамады. C++11-де көрсеткіштердің мәндері басқа мәндерден "қауіпсіз шығарылатын" жағдайларды анықтайды. Бір іске асыруда оның қатаң көрсеткіш қауіпсіздігімен жұмыс істейтіндігі көрсетілуі мүмкін, бұл жағдайда осы ережелерге сәйкес шығарылмаған көрсеткіштері жарамсыз болуы мүмкін.
C++ стандартты кітапханасының өзгерістері
C++11 стандартты кітапханасына бірқатар жаңа мүмкіндіктер енгізілді. Бұлардың көбі ескі стандарт бойынша іске асырылуы мүмкін еді, бірақ кейбіреулері (көп немесе аз дәрежеде) жаңа C ++ 11 негізгі мүмкіндіктеріне сүйенеді. Жаңа кітапханалардың көп бөлігі 2005 жылы жарияланған C++ стандарттар комитетінің кітапханалық техникалық баяндамасында (TR1 деп аталады) анықталды. Қазіргі уақытта TR1 std:: tr1 атау кеңістігін пайдалана отырып, TR1 -тің әртүрлі толық және ішінара іске асырылуы бар. C++11 үшін олар std атау кеңістігіне көшірілді. Алайда, TR1 функциялары C++11 стандартты кітапханасына енгізілгеннен кейін, олар бастапқы TR1 нұсқасында жоқ C++11 тілінің мүмкіндіктерімен қажет болған жағдайда жаңартылды. Сондай-ақ, олар C++03 аясында мүмкін болатын, бірақ бастапқы TR1 спецификациясының бөлігі болмаған мүмкіндіктермен жетілдірілген болуы мүмкін.
Тақырыптық құрылғылар
C++03 тілі желілерді қолданатын жад моделін ұсынғанмен, желілерді пайдалану үшін негізгі қолдау C++11 стандартты кітапханасымен бірге келеді. Жаңа желіде орындалуы үшін функция объектісін (және оған тапсыратын опциялық аргументтер сериясын) алатын желі класы (std::thread) ұсынылады. Басқа орындаушы желі аяқталғанға дейін желі тоқтату мүмкін, std::thread::join мүшесі арқылы желі қосылуды қамтамасыз ету. Std::thread::native handle мүшесі арқылы платформаға тән операцияларды орындау үшін, мүмкін болған жағдайда, негізгі native thread object ((s) -ге қолжетімділік қамтамасыз етіледі. Сызықтар арасындағы синхрондау үшін тиісті мутекстер (std::mutex, std::recursive mutex және т.б.) және шартты айнымалылар (std:: шартты айнымалы және std:: шартты айнымалы кез келген) кітапханаға қосылады. Бұларға ресурстарды алуды бастау (RAII) бұғаттауыштары (std::lock guard және std::unique lock) және оңай пайдалану үшін бұғаттауыш алгоритмдері арқылы қол жетімді. Жоғары өнімділік, төмен деңгейдегі жұмыс үшін кейде мутекстерсіз желілер арасындағы байланыс қажет. Бұл жад орындарында атомдық операцияларды қолдану арқылы жасалады. Бұл опционалды түрде операция үшін қажетті жад көрінуінің ең төменгі шектеулерін анықтай алады. Бұл мақсатта есте сақтаудың нақты кедергілері де қолданылуы мүмкін. C++11 желі кітапханасына желілер арасында асинхронды нәтижелерді берудің болашағы мен уәделері, сондай-ақ осындай асинхронды нәтиже шығаратын функция шақыруын жабу үшін std::packaged тапсырмасы кіреді. Фьючерстік ұсынысты сынға алды, өйткені ол фьючерсті біріктірудің жолын таппайды және бір уәделердің ішінде бір уәделердің орындалуын тексереді. Тақырыптар топтары сияқты жоғары деңгейдегі тағы да басқа құрылғылар C++ техникалық баяндамасына енгізілген. Олар C++11 құрамына кірмейді, бірақ олардың ақырғы іске асырылуы толығымен желілік кітапхананың ерекшеліктері негізінде құрылады деп күтілуде. Жаңа std::async құрылғысы тапсырмаларды орындаудың және оларды std::future-мен байланыстырудың ыңғайлы әдісін ұсынады. Пайдаланушы тапсырманы жеке желіде синхронды түрде немесе мәнді күтетін желіде синхронды түрде орындай алатынын таңдай алады. Әдеттегідей, іске асыру таңдауға болады, бұл аппараттық қатарлылықты артық жазылусыз пайдаланудың оңай әдісін ұсынады және қарапайым пайдалану үшін желілік пулдың кейбір артықшылықтарын ұсынады.
Жалпы мақсаттағы ақылды көрсеткіш
C++11 TR1 бағдарламасына және одан кейінгі жетілдірілімдерді ұсынады. қолданылмайды.
Жойылған немесе ескірген ерекшеліктер
Реттік нүкте термині алынып тасталды, оның орнына бір операция екіншісінен бұрын реттелгенін немесе екі операция реттелмегенін көрсету арқылы ауыстырылды. Кілт сөзді экспорттаудың бұрынғы қолданылуы алынып тасталды. Кілт сөздің өзі сақталады, болашақтағы ықтимал пайдалану үшін сақталады. Динамикалық ерекшеліктер ерекшеліктері қолданылмайды. Noexcept кілт сөзін қолдану арқылы, оптималдастыру үшін пайдалы, ерекшелік емес функцияларды шығарудың компиляциялық уақыт ерекшелігі қол жетімді. std::auto ptr деген ескірген, оның орнына std::unique ptr деген пайда болды. Функция объектілерінің базалық кластары (std:: unary function, std:: binary function), функциялар көрсеткіштеріне адаптерлер және мүшелерге көрсеткіштеріне адаптерлер және байлаушы кластар бәрі ескірген.