C++17
C++17 هي نسخة من معيار ISO / IEC 14882 للغة البرمجة C++ . حلت C++17 محل النسخة السابقة من معيار C++، والتي كانت تسمى C++14 ، ثم حلت محلها لاحقًا C++20 .
تاريخ
قبل أن تحدد لجنة معايير لغة C++ دورة إصدار مدتها ثلاث سنوات، كان موعد إصدار C++17 غير مؤكد. خلال تلك الفترة، أُطلق على مراجعة C++17 أيضًا اسم C++1z ، بعد C++0x أو C++1x للغة C++11 وC++1y للغة C++14 . وصلت مواصفات C++17 إلى مرحلة مسودة المعيار الدولي (DIS) في مارس 2017. [ 1 ] [ 2 ] تمت الموافقة على هذه المسودة بالإجماع، مع بعض التعليقات التحريرية فقط، [ 3 ] ونُشر المعيار النهائي تحت اسم ISO/IEC 14882:2017 في ديسمبر 2017. [ 4 ] أُجريت تغييرات طفيفة على مكتبة قوالب C++ القياسية ، على الرغم من دعم بعض الخوارزميات في ملف <algorithm>الرأس للتوازي الصريح وإجراء بعض التحسينات النحوية .
ميزات جديدة
أضافت لغة C++17 العديد من الميزات الجديدة. قد تكون القوائم التالية غير مكتملة.
لغة
- جعل الرسالة النصية
static_assertاختيارية [ 5 ] - السماح
typename(كبديل لـclass) في معلمةtemplateالقالب [ 6 ] - قواعد جديدة
autoللاستنتاج من قائمة التهيئة ذات الأقواس [ 7 ] [ 8 ] - تعريفات مساحات الأسماء المتداخلة، على سبيل المثال، بدلاً من [ 8 ] [ 9 ]
namespaceX::Y{...}namespaceX{namespaceY{...}} - السماح بالسمات لمساحات الأسماء والمعددين [ 10 ] [ 11 ]
- السمات القياسية الجديدة ، و [ 12 ]
[[fallthrough]][[maybe_unused]][[nodiscard]] - UTF-8 (
u8) الأحرف الحرفية [ 10 ] [ 13 ] (كانت الأحرف الحرفية لسلسلة UTF-8 موجودة منذ C++11 ؛ أضافت C++17 الأحرف الحرفية المقابلة من أجل الاتساق، على الرغم من أنها مقيدة ببايت واحد، إلا أنها لا تستطيع تخزين سوى " اللاتينية الأساسية " ورموز التحكم C0 ، أي ASCII ) - القيم الحرفية ذات الفاصلة العائمة السداسية عشرية [ 14 ] [ 15 ]
- استخدام
autoكنوع لمعامل قالب غير نوعي [ 16 ] - التقييم الثابت لجميع وسائط القوالب غير النوعية [ 10 ] [ 17 ]
- تعبيرات الطي، للقوالب المتغيرة [ 10 ] [ 18 ]
- ثابت وقت الترجمة
ifبالشكل [ 19 ]ifconstexpr(expression) - إعلانات الربط المهيكلة، مما يسمح [ 20 ]
auto[a,b]=getTwoReturnValues(); - المُهيئات في
ifوswitchالعبارات [ 21 ] - لا ينتج عن تهيئة النسخ والتهيئة المباشرة للكائنات من النوع
Tمن تعبيرات prvalue من النوع (مع تجاهل مُؤهِّلات cv ذات المستوى الأعلى) أي مُنشئات نسخ أو نقل من تعبير prvalue. راجع حذف النسخ لمزيد من المعلومات.T - بعض التوسعات المتعلقة بتخصيص الذاكرة المفرطة المحاذاة [ 22 ]
- استنتاج وسيطات قالب الفئة (CTAD)، الذي يقدم أدلة استنتاج المُنشئ، على سبيل المثال السماحبدلاً من اشتراط أنواع وسيطات المُنشئ الصريحةأو دالة قالب مساعدة إضافية. [ 23 ] [ 24 ]
std::pair(5.0,false)std::pair<double,bool>(5.0,false)std::make_pair(5.0,false) - المتغيرات المضمنة، والتي تسمح بتعريف المتغيرات في ملفات الرأس دون انتهاك قاعدة التعريف الواحد . القواعد هي نفسها فعليًا قواعد الدوال المضمنة.
__has_include، مما يسمح بفحص توافر رأس الملف بواسطة توجيهات المعالج المسبق [ 25 ]- تم تغيير قيمة
__cplusplusإلى201703L[ 26 ] - تم جعل مواصفات الاستثناء جزءًا من نوع الوظيفة [ 27 ]
- يمكن لتعبيرات لامدا التقاط "
*this" بالقيمة [ 28 ]
مكتبة
- معظم أساسيات المكتبة TS I، بما في ذلك: [ 29 ] [ 30 ]
<string_view>رأس الصفحة:std::string_view، مرجع للقراءة فقط غير مملوك لتسلسل أحرف أو شريحة سلسلة [ 31 ]<optional>:std::optional، لتمثيل الكائنات الاختيارية ، وهو نوع بيانات قد لا يتم إرجاعه دائمًا بواسطة خوارزمية معينة مع دعم عدم الإرجاع<any>:std::any، لتمثيل أي نوع ، والذي يحتوي على قيمة واحدة من أي نوع
std::uncaught_exceptions، كبديل لـstd::uncaught_exceptionفي معالجة الاستثناءات . [ 32 ] [ 10 ] موجود في<exception>.uncaught_exceptionsيحسب عدد الاستثناءات في سلسلة العمليات الحالية التي تم طرحها/إعادة طرحها ولم تدخل بعد فيcatchعبارة مطابقة، بينماuncaught_exceptionيكتشف فقط ما إذا كان فك المكدس قيد التقدم.- وظائف إدراج جديدة
try_emplaceلهياكل البيانات الترابطيةinsert_or_assignللمفتاح والقيمةstd::map(خريطة الشجرة) وstd::unordered_map(خريطة التجزئة) [ 33 ] [ 34 ] - الوصول الموحد إلى الحاويات : و
std::size[ 34 ] [ 35 ]std::emptystd::data - تعريف " المكررات المتجاورة " [ 34 ] [ 36 ]
<filesystem>: مكتبة نظام الملفات ،std::filesystem(مبنية علىboost::filesystem) [ 37 ]- نسخ متوازية من خوارزميات STL [ 38 ]
<cmath>: دوال رياضية خاصة إضافية ، بما في ذلك التكاملات الإهليلجية ودوال بيسل [ 39 ]<variant>:std::variant، حاوية اتحاد موسومة [ 40 ]std::byte، مما يسمح باستبدال الحرف لأنواع البيانات التي تهدف إلى نمذجة بايت من البيانات كبايت بدلاً من حرف [ 41 ]- سمات العامل المنطقي:
std::conjunction،std::disjunctionوstd::negation[ 42 ] <memory_resource>رأسية، لموارد الذاكرة متعددة الأشكال [ 43 ]
الميزات المحذوفة
لم يقتصر هذا التحديث للغة C++ على إضافة ميزات جديدة فحسب، بل قام أيضًا بإزالة بعضها.
- تم حذف الأحرف الثلاثية . [ 44 ] [ 45 ]
- أُزيلت بعض الأنواع والدوال المهملة من المكتبة القياسية ، بما في ذلك
std::auto_ptrالدوالstd::random_shuffleالقديمة ومحولات الدوال القديمة. [ 8 ] [ 46 ] وقد استُبدلت هذه الدوال في C++11 بميزات محسّنة مثلstd::unique_ptrالدوال المحسّنةstd::shuffleوالدوالstd::bindالمحسّنة ودوال لامدا. - تم حذف استخدام الكلمة المفتاحية (التي كانت مهملة سابقًا)
registerكمحدد لفئة التخزين. [ 47 ] لا تزال هذه الكلمة المفتاحية محجوزة ولكنها غير مستخدمة حاليًا.
دعم المُترجم
- يدعم GCC ميزات لغة C++17 بشكل كامل منذ الإصدار 8. [ 48 ]
- يدعم Clang 5 والإصدارات الأحدث جميع ميزات لغة C++17. [ 49 ]
- يدعم Visual Studio 2017 الإصدار 15.8 (MSVC 19.15) والإصدارات الأحدث جميع ميزات لغة C++17. [ 50 ] [ 51 ]
دعم المكتبة
- يدعم libstdc++ منذ الإصدار 9.1 بشكل كامل C++17 (8.1 بدون Parallelism TS ويشير إلى C99 بدلاً من C11) [ 52 ]
- يدعم libc++ اعتبارًا من الإصدار 9 دعمًا جزئيًا لـ C++17، مع كون الباقي "قيد التقدم" [ 53 ]
- يدعم Visual Studio 2017 الإصدار 15.8 (MSVC 19.15) والإصدارات الأحدث جميع ميزات مكتبة C++17 باستثناء "تحويلات السلاسل النصية الأساسية" والإشارة إلى C99 بدلاً من C11. تمت إضافة "تحويلات السلاسل النصية الأساسية" في Visual Studio 2019 الإصدار 16.4 [ 54 ].
انظر أيضاً
مراجع
- ↑ "تقرير المحررين N4661 - لغات البرمجة - C++" . 21 مارس 2017. مؤرشف من الأصل في 4 فبراير 2020. تم الاطلاع عليه في 21 مارس 2017 .
- ↑ "ISO/IEC DIS 14882: لغات البرمجة - C++" (ملف PDF) . مؤرشف من النسخة الأصلية (ملف PDF) بتاريخ 25-03-2017.
- ↑ هيرب ساتر (6 سبتمبر 2017). "الموافقة الرسمية على C++17" . مؤرشف من الأصل في 29 يناير 2020. تم الاطلاع عليه في 12 سبتمبر 2017 .
- ↑ "ISO/IEC 14882:2017" . مؤرشف من الأصل بتاريخ 29-01-2013 . تم الاطلاع عليه بتاريخ 03-12-2017 .
- ↑ "N3928: توسيع static_assert، الإصدار 2 (والتر إي. براون)" (ملف PDF) . مؤرشف (ملف PDF) من الأصل بتاريخ 11 أغسطس 2015. تم الاطلاع عليه بتاريخ 3 أبريل 2015 .
- ↑ "N4051: السماح باستخدام اسم النوع في مُعامل قالب القالب (ريتشارد سميث)" . مؤرشف من الأصل بتاريخ 11 أغسطس 2015. تم الاطلاع عليه بتاريخ 3 أبريل 2015 .
- ↑ "N3922: قواعد جديدة للاستنتاج التلقائي من قائمة الأحرف المائلة (جيمس دينيت)" . مؤرشف من الأصل بتاريخ 10 أغسطس 2015. تم الاطلاع عليه بتاريخ 28 نوفمبر 2014 .
- ١ ٢ ٣ "تحديثات لتقرير رحلتي" . مؤرشف من الأصل بتاريخ ١٩ مارس ٢٠١٥. تم الاطلاع عليه بتاريخ ٢٨ نوفمبر ٢٠١٤ .
- ↑ "N4230: تعريف مساحة الاسم المتداخلة (روبرت كاولاك، أندرو تومازوس)" . مؤرشف من الأصل بتاريخ 2015-08-03 . تم الاطلاع عليه بتاريخ 2014-11-28 .
- 1 2 3 4 5 "اعتماد أوراق اللغة الأساسية الجديدة لـ C++17" . مؤرشف من الأصل بتاريخ 27 أبريل 2015. تم الاطلاع عليه بتاريخ 15 نوفمبر 2014 .
- ↑ "N4266: سمات مساحات الأسماء والمُعدِّدات (ريتشارد سميث)" . مؤرشف من الأصل بتاريخ 2016-03-06 . تم الاطلاع عليه بتاريخ 2014-11-15 .
- ↑ "N4640: مسودة عمل، معيار للغة البرمجة C++" (ملف PDF) . الصفحات 193-195 . مؤرشف (ملف PDF) من الأصل بتاريخ 12 مارس 2017. تم الاطلاع عليه بتاريخ 9 مارس 2017 .
- ↑ "N4267: إضافة الأحرف الحرفية u8 (ريتشارد سميث)" . مؤرشف من الأصل بتاريخ 28-10-2015 . تم الاطلاع عليه بتاريخ 15-11-2014 .
- ↑ توماس كوب. "القيم الحرفية ذات العدد العشري الست عشري للغة C++" . مؤرشف من الأصل بتاريخ 21-09-2022 . تم الاطلاع عليه بتاريخ 16-07-2017 .
- ↑ "N4659: مسودة عمل، معيار للغة البرمجة C++" (ملف PDF) . §5.13.4. مؤرشف (ملف PDF) من الأصل بتاريخ 2017-12-07 . تم الاطلاع عليه بتاريخ 2017-03-24 .
- ↑ جيمس توتون؛ مايك سبيرتوس (23 يونيو 2016). "تعريف معلمات القوالب غير النوعية باستخدام auto" . مؤرشف من الأصل في 16 سبتمبر 2017. تم الاطلاع عليه في 8 نوفمبر 2020 .
- ↑ "N4268: السماح بتقييم الثوابت لجميع وسائط القوالب غير النوعية (ريتشارد سميث)" . مؤرشف من الأصل بتاريخ 12 مارس 2016. تم الاطلاع عليه بتاريخ 15 نوفمبر 2014 .
- ↑ "N4295: طي التعبيرات (أندرو ساتون، ريتشارد سميث)" . مؤرشف من الأصل بتاريخ 2015-04-04 . تم الاطلاع عليه بتاريخ 2014-11-15 .
- ↑ "N4659: مسودة عمل، معيار للغة البرمجة C++" (ملف PDF) . §9.4.1. مؤرشف (ملف PDF) من الأصل بتاريخ 2017-12-07 . تم الاطلاع عليه بتاريخ 2017-03-24 .
- ↑ "N4659: مسودة عمل، معيار للغة البرمجة C++" (ملف PDF) . §11.5. مؤرشف (ملف PDF) من الأصل بتاريخ 2017-12-07 . تم الاطلاع عليه بتاريخ 2017-03-24 .
- ↑ "عبارات الاختيار مع المُهيئ" . مؤرشف من الأصل بتاريخ 2017-10-06 . تم الاطلاع عليه بتاريخ 2018-10-09 .
- ↑ "تخصيص الذاكرة الديناميكي للبيانات ذات المحاذاة الزائدة" . مؤرشف من الأصل بتاريخ 2017-09-08 . تم الاطلاع عليه بتاريخ 2017-03-13 .
- ↑ "استنتاج وسيط قالب الفئة" . مؤرشف من الأصل بتاريخ 31 يناير 2019. تم الاطلاع عليه بتاريخ 30 يناير 2019 .
- ↑ "مؤتمر CppCon 2018: تيمور دوملر "استنتاج وسيط قالب الفئة في C++17"" . يوتيوب . مؤرشف من الأصل بتاريخ 21-08-2019 . تم الاسترجاع بتاريخ 30-01-2019 .
- ↑ "N4640: مسودة عمل، معيار للغة البرمجة C++" (ملف PDF) . الصفحات 431-433 . مؤرشف (ملف PDF) من الأصل بتاريخ 12 مارس 2017. تم الاطلاع عليه بتاريخ 9 مارس 2017 .
- ↑ "N4659: مسودة عمل، معيار للغة البرمجة C++" (ملف PDF) . §19.8. مؤرشف (ملف PDF) من الأصل بتاريخ 2017-12-07 . تم الاطلاع عليه بتاريخ 2017-03-24 .
- ↑ "P0012R1: جعل مواصفات الاستثناءات جزءًا من نظام النوع، الإصدار 5" . مؤرشف من الأصل بتاريخ 12-09-2017 . تم الاطلاع عليه بتاريخ 17-12-2018 .
- ↑ "P0018R3: Lambda Capture of *this by Value as [ =,*this ] , version 3" . مؤرشف من الأصل بتاريخ 22-08-2017 . تم الاطلاع عليه بتاريخ 21-06-2021 .
- ↑ "اعتماد مكونات TypeScript الأساسية للمكتبة الإصدار 1 للغة C++17 (R1)" . مؤرشف من الأصل بتاريخ 2016-04-05 . تم الاطلاع عليه بتاريخ 2016-03-23 .
- ↑ "الحالة الحالية" . مؤرشف من الأصل بتاريخ 2020-09-08.
- ↑ "std::basic_string_view - cppreference.com" . en.cppreference.com . مؤرشف من الأصل بتاريخ 17-06-2016 . تم الاطلاع عليه بتاريخ 23-06-2016 .
- ↑ "N4259: صياغة std::uncaught_exceptions (Herb Sutter)" (ملف PDF) . مؤرشف (PDF) من الأصل بتاريخ 29-11-2014 . تم الاطلاع عليه بتاريخ 15-11-2014 .
- ↑ "N4279: واجهة إدخال محسّنة لخرائط المفاتيح الفريدة (توماس كوبي)" . مؤرشف من الأصل بتاريخ 27 أبريل 2015. تم الاطلاع عليه بتاريخ 15 نوفمبر 2014 .
- 1 2 3 "اعتماد أوراق المكتبة القياسية الجديدة للغة C++17" . مؤرشف من الأصل بتاريخ 29-11-2014 . تم الاطلاع عليه بتاريخ 15-11-2014 .
- ↑ "N4280: حجم غير عضو (size()) والمزيد (ريكاردو ماركانجيلو)" (ملف PDF) . مؤرشف (PDF) من الأصل بتاريخ 9 مارس 2015. تم الاطلاع عليه بتاريخ 15 نوفمبر 2014 .
- ↑ "N4284: المُكرِّرات المتجاورة (ينس ماورر)" . مؤرشف من الأصل بتاريخ 29-11-2014 . تم الاطلاع عليه بتاريخ 15-11-2014 .
- ↑ "مقترح مكتبة نظام الملفات (بيمان داوز)" . مؤرشف من الأصل بتاريخ 20 يوليو 2016. تم الاطلاع عليه بتاريخ 12 ديسمبر 2015 .
- ↑ "ينبغي توحيد معايير التوازي" . مؤرشف من الأصل بتاريخ 2016-04-05 . تم الاطلاع عليه بتاريخ 2016-03-23 .
- ↑ "الدوال الرياضية الخاصة للغة C++17، الإصدار 5" (ملف PDF) . مؤرشف (ملف PDF) من النسخة الأصلية بتاريخ 2016-04-05 . تم الاطلاع عليه بتاريخ 2016-03-23 .
- ↑ "N4659: مسودة عمل، معيار للغة البرمجة C++" (ملف PDF) . §23.7. مؤرشف (ملف PDF) من الأصل بتاريخ 2017-12-07 . تم الاطلاع عليه بتاريخ 2017-03-24 .
- ↑ "تعريف نوع البايت" (ملف PDF) . مؤرشف (ملف PDF) من الأصل بتاريخ 25-03-2017 . تم الاطلاع عليه بتاريخ 25-03-2017 .
- ↑ "N4659: مسودة عمل، معيار للغة البرمجة C++" (ملف PDF) . §23.15.8. مؤرشف (ملف PDF) من الأصل بتاريخ 2017-12-07 . تم الاطلاع عليه بتاريخ 2017-03-24 .
- ↑ "وصف كامل لموارد الذاكرة متعددة الأشكال (PMR) - نيكو جوسوتيس" . مؤرشف من الأصل بتاريخ 28 أغسطس 2021. تم الاطلاع عليه بتاريخ 16 نوفمبر 2020 .
- ↑ "N3981: إزالة الثلاثيات؟! (ريتشارد سميث)" . 2014-05-06. مؤرشف من الأصل في 2018-07-09 . تم الاطلاع عليه في 2015-04-03 .
- ↑ تعليق من شركة IBM حول الاستعداد لمستقبلٍ خالٍ من تقنية Trigraph في لغة C++17. مؤرشف بتاريخ 11 سبتمبر 2018 في أرشيف Wayback Machine ، ورقة بحثية من IBM رقم N4210، بتاريخ 10 أكتوبر 2014. المؤلفون: مايكل وونغ، هوبرت تونغ، راجان بهاكتا، ديريك إنجليس.
- ↑ "N4190: إزالة auto_ptr و random_shuffle() وأشياء وظيفية قديمة ( ستيفان ت. لافافيج)" . مؤرشف من الأصل بتاريخ 20-10-2017 . تم الاطلاع عليه بتاريخ 28-11-2014 .
- ↑ "الكلمات المفتاحية في لغة C++: register" . مؤرشف من الأصل بتاريخ 2018-09-03 . تم الاطلاع عليه بتاريخ 2018-09-03 .
- ↑ "دعم معايير لغة C++ في GCC - مشروع جنو - مؤسسة البرمجيات الحرة (FSF)" . gcc.gnu.org . مؤرشف من الأصل بتاريخ 2018-04-04 . تم الاطلاع عليه بتاريخ 2018-04-03 .
- ↑ "حالة Clang - C++17، C++14، C++11، وC++98" . clang.llvm.org . مؤرشف من الأصل بتاريخ 2013-07-04 . تم الاطلاع عليه بتاريخ 2018-06-26 .
- ↑ corob-msft. "توافق لغة Visual C++" . docs.microsoft.com . مؤرشف من الأصل بتاريخ 19-06-2018 . تم الاطلاع عليه بتاريخ 19-06-2018 .
- ↑ "إعلان: MSVC متوافق مع معيار C++" . 7 مايو 2018. مؤرشف من الأصل بتاريخ 26 أغسطس 2018. تم الاطلاع عليه بتاريخ 8 مايو 2018 .
- ↑ "الفصل 1. الحالة" . gcc.gnu.org . مؤرشف من الأصل بتاريخ 2018-06-04 . تم الاطلاع عليه بتاريخ 2018-06-19 .
- ↑ "حالة مكتبة libc++ في C++17" . llvm.org . مؤرشف من الأصل بتاريخ 24-05-2019 . تم الاطلاع عليه بتاريخ 24-05-2019 .
- ↑ "إعلان: MSVC متوافق مع معيار C++" . devblogs.microsoft.com . 7 مايو 2018. مؤرشف من الأصل بتاريخ 26 أغسطس 2018. تم الاطلاع عليه بتاريخ 24 مايو 2019 .
- لغة سي++
- عائلة لغات البرمجة C++
- معايير لغات البرمجة
- معايير اللجنة الكهروتقنية الدولية
- معايير ISO
