it-swarm.asia

ما هي الميزات الجديدة في C++ 17؟

ميزة C++ 17 أصبحت الآن مكتملة ، ومن غير المرجح أن تواجه تغييرات كبيرة. تم طرح مئات المقترحات لـ C++ 17.

أي من هذه الميزات تمت إضافتها إلى C++ في C++ 17؟

عند استخدام برنامج التحويل البرمجي C++ الذي يدعم "C++ 1z" ، أي من هذه الميزات ستكون متاحة عند تحديث برنامج التحويل البرمجي إلى C++ 17؟

941
Yakk - Adam Nevraumont

سمات اللغة:

قوالب ورمز عام

امدا

سمات

تنظيف بناء الجملة

نظافة متعددة العودة والتحكم في التدفق

  • الارتباطات المركبة

    • بشكل أساسي ، std::tie من الدرجة الأولى مع autoname__
    • مثال:
      • const auto [it, inserted] = map.insert( {"foo", bar} );
      • ينشئ متغيرات itو insertedبنوع مستخلص من pairالذي map::insert يعرضه.
    • يعمل مع Tuple/الزوج الذي يحب & std::arrays والهياكل مسطحة نسبيا
    • اسمه في الواقع الارتباطات المنظمة في المعيار
  • if (init; condition) و switch (init; condition)

    • if (const auto [it, inserted] = map.insert( {"foo", bar} ); inserted)
    • يمتد if(decl) إلى الحالات التي يكون فيها declغير قابل للتحويل إلى منطقي.
  • التعميم القائم على النطاق للحلقات

    • يظهر أن يكون في الغالب دعمًا للحراس ، أو التكرارات النهائية التي ليست من نفس النوع مثل التكرارات التي تبدأ ، والتي تساعد في إنهاء الحلقات الفارغة وما شابه ذلك.
  • إذا constexpr

    • ميزة مطلوبة كثيرًا لتبسيط التعليمات البرمجية العامة تقريبًا.

متفرقات

إضافات المكتبة:

أنواع البيانات

  • std::variant<Ts...>

    • دائما تقريبا غير فارغ الماضي راجعت؟
    • الموسومة نوع الاتحاد
    • {رهيبة | المفيد}
  • std::optional

    • ربما يحمل واحدة من شيء
    • مفيدة يبعث على السخرية
  • std::any

    • يحمل واحدة من أي شيء (وهذا قابل للنسخ)
  • std::string_view

    • std::string مثل مرجع صفيف أو سلسلة فرعية
    • لا تأخذ string const& مرة أخرى. يمكن أن تجعل تحليل bajillion مرات أسرع.
    • "hello world"sv
    • constexpr char_traits
  • std::byte قبالة أكثر مما يمكن مضغه.

    • لا عدد صحيح ولا حرف ، فقط البيانات

استدعاء الاشياء

نظام الملفات TS v1

خوارزميات جديدة

  • for_each_n

  • reducename__

  • transform_reduce

  • exclusive_scan

  • inclusive_scan

  • transform_exclusive_scan

  • transform_inclusive_scan

  • تمت إضافته لأغراض الترابط ، مكشوفًا حتى إذا لم تكن تستخدمها مترابطة

خيوط

(أجزاء من) أساسيات المكتبة TS v1 لم يتم تغطيتها أعلاه أو أدناه

تحسينات الحاوية

يتغير المؤشر الذكي

تحسينات نوع البيانات stdالأخرى:

متفرقات

سمات

إهمال

Isocpp.org has لديه قائمة مستقلة من التغييرات منذ C++ 14؛ لقد نهب جزئيا.

بطبيعة الحال ، يستمر عمل TS بشكل متوازٍ ، لذلك هناك بعض الخدمات TS غير الناضجة التي يجب أن تنتظر التكرار التالي. الهدف من التكرار التالي هو C++ 20 كما هو مخطط له سابقًا ، وليس C++ 19 كما تشير بعض الشائعات. تم تجنب C++ 1O.

القائمة الأولية مأخوذة من مشاركة reddit هذه و مشاركة reddit ، مع روابط مضافة عبر googling أو من صفحة isocpp.org أعلاه.

تم حذف إدخالات إضافية من SD-6 قائمة اختبار الميزات.

قائمة ميزات clang و قائمة ميزات المكتبة بجانب النهب. لا يبدو هذا موثوقًا به ، لأنه C++ 1z ، وليس C++ 17.

هذه الشرائح لديها بعض الميزات المفقودة في مكان آخر.

بينما لم يتم طلب "ما تمت إزالته" ، فإليك قائمة مختصرة تتضمن بعض الأشياء ((معظمها؟) التي تم إهمالها سابقًا) والتي تمت إزالتها في C++ 17 من C++:

إزالة:

كانت هناك إعادة صياغة. لست متأكدًا مما إذا كان لهذه التأثيرات أي تأثير على الكود ، أو إذا كانت مجرد عمليات تنظيف في المعيار:

الأوراق التي لم يتم دمجها في أعلاه:

  • P0505R0 (constexpr chrono)

  • P0418R2 (القرص الذري)

  • P0512R0 (قرص وسيطة خصم القرص)

  • P0490R0 (تعديلات الربط المنظمة)

  • P0513R0 (التغييرات إلى std::hash)

  • P0502R0 (استثناءات متوازية)

  • P0509R1 (تحديث القيود على معالجة الاستثناءات)

  • P0012R1 (اجعل مواصفات الاستثناء جزءًا من نظام الكتابة)

  • P0510R0 (قيود على المتغيرات)

  • P0504R0 (علامات للاختيار/البديل/أي)

  • P0497R0 (قرص ptr المشترك)

  • P0508R0 (مقابض عقدة الربط المركبة)

  • P0521R0 (عدد مرات استخدام المؤشر المشترك وتغييرات فريدة؟)

تغييرات المواصفات:

مرجع آخر:

1204
Yakk - Adam Nevraumont