وافقت لجنة الأيزو على معيار "C ++ 20"





في الآونة الأخيرة ، وافقت لجنة ISO لتوحيد لغة C ++ (نعم ، هناك واحدة) على المعيار الدولي "C ++ 20". الميزات الواردة في المواصفات مدعومة من قبل مترجمي GCC و Clang و Microsoft Visual C ++. بالإضافة إلى ذلك ، يتم تنفيذ مكتبات قياسية مع دعم "C ++ 20" ضمن مشروع Boost.



الخطوة التالية هي تحضير الوثيقة للنشر. بعد ذلك ، في أوائل نوفمبر ، سيتم إرسال الإصدار النهائي إلى ISO ، وبعد ذلك سيتم نشره تحت الاسم الرسمي ISO / IEC 14882: 2020. تعمل اللجنة بالفعل على المعيار التالي ، C ++ 23 (C ++ 2b). تحت القطع - ميزات "C ++ 20" مع أمثلة التعليمات البرمجية.



ما هو الجديد؟



أضافت اللجنة "مفاهيم" ، وامتدادات للقوالب تسمح لك بتحديد مجموعة من المتطلبات لمعلمات النموذج. في وقت الترجمة ، فإنها تقيد مجموعة الوسائط التي يمكن قبولها كمعلمات نموذجية. تجعل المفاهيم من الممكن تجنب التناقضات المنطقية بين خصائص أنواع البيانات المستخدمة داخل القالب وخصائص أنواع البيانات لمعلمات الإدخال.



 template<typename T>
   concept EqualityComparable = requires(T a, T b) {
       { a == b } -> std::boolean;
       { a != b } -> std::boolean;
   };


تمديد مقبول للعمل مع الوحدات. يمكن استخدامها بدلاً من ملفات الرأس. توفر الوحدات النمطية طريقة جديدة لتنظيم المصادر بناءً على تعريف حدود المكونات ، بدون تضمين ملفات الرأس باستخدام رؤوس "#include".



تمت إضافة ماكرو __VA_OPT__ للتوسع التكيفي لوحدات الماكرو المتغيرة اعتمادًا على وجود الرموز المميزة في الوسيطة المتغيرة.



تمت إضافة دعم عامل التشغيل <=> للمقارنة ثلاثية الاتجاهات. يتم



دعم مُهيئ العنصر الافتراضي لحقول البت.



تمت إضافة القدرة على التقاط تعبيرات لامدا * هذا.



   struct int_value {
     int n = 0;
     auto getter_fn() {
       // BAD:
       // return [=]() { return n; };
 
       // GOOD:
       return [=, *this]() { return n; };
     }
   };
 


يمكن للفصول الآن استخدام معلمات قالب غير معروفة.



   struct foo {
     foo() = default;
     constexpr foo(int) {}
   };
 
   template <foo f>
   auto get_foo() {
     return f; 
   }
 
   get_foo(); // uses implicit constructor
   get_foo<foo{123}>();


الآن يمكنك استخدام سلسلة حرفية في معلمات القالب. يتم دعم بناء جملة تهيئة نمط C. تتم تهيئة تلك التي لم يتم سردها بشكل صريح في قوائم تهيئة الحقل افتراضيًا.



struct A {
     int x;
     int y;
     int z = 123;
   };
 
   A a {.x = 1, .z = 2}; // a.x == 1, a.y == 0, a.z == 2


يتم دعم أعضاء هياكل البيانات الفارغة .



يتم دعم السمات المحتملة وغير المحتملة لإعلام المحسن باحتمالية تشغيل العبارة الشرطية ("[[من المحتمل]] إذا (عشوائي> 0) {").



يمكنك الآن استخدام النطاقات لتهيئة القيم المتغيرة في حلقة for



   for (auto v = std::vector{1, 2, 3}; auto& e : v) {


يتم دعم الوظائف الفورية ، والتي يمكن أن تعمل فقط مع الثوابت.



 consteval int sqr(int n) {
     return n * n;
   }
 
   constexpr int r = sqr(100); // OK
   int x = 100;
   int r2 = sqr(x); // ERROR:  'x'     


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

  • دعم نوع char8_t لسلاسل UTF-8.
  • رؤوس بت (عمليات بت) وإصدار.
  • القدرة على التحقق من بادئة ولاحقة السلاسل (يبدأ_ بـ ، وينتهي_مع).
  • السمات std :: remove_cvref و std :: unsrap_reference و std :: unsrap_decay_ref و std :: is_nothrow_convertible و std :: type_identity.
  • الدالات std :: midpoint و std :: lerp و std :: bind_front و std :: source_location و std :: visit و std :: is_constant_evaluated و std :: impl_aligned.
  • دعم المصفوفات في std :: make_shared.
  • std :: to_array وظيفة لتحويل كائنات تشبه المصفوفة إلى std :: array.


أصبح بناء جملة التعداد أكثر ملاءمة الآن:

   enum class rgba_color_channel { red, green, blue, alpha };
 
   std::string_view to_string(rgba_color_channel my_channel) {
     switch (my_channel) {
       using enum rgba_color_channel;
       case red:   return "red";
       case green: return "green";
       case blue:  return "blue";
       case alpha: return "alpha";
    }
   }


يحظر استخدام عمليات "،" ("a [b، c]") في الفهارس . لا يتم دعم معظم العمليات على المتغيرات المُعلنة بالكلمة الأساسية المخالفة ، بما في ذلك ++ الممنوعة والعمليات على الأنواع القياسية.






All Articles