تمت الموافقة على معيار C++20

لجنة ISO لتوحيد لغة C++ وافق المعيار الدولي "سي ++ 20". القدرات المقدمة في المواصفات، باستثناء الحالات المعزولة، أيد في المجمعين الخليج, قعقع и مايكروسوفت البصرية C ++. يتم تنفيذ المكتبات القياسية التي تدعم C++ 20 داخل المشروع زيادة.

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

رئيسي ملامح سي ++ 20 (أمثلة التعليمات البرمجية):

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

    نموذج
    مفهوم المساواة القابلة للمقارنة = يتطلب (T a، T b) {
    { أ == ب } -> std::boolean;
    { أ != ب } -> std::boolean;
    };

  • قبلت توسع للعمل مع الوحدات النمطية التي يمكن استخدامها بدلاً من ملفات الرأس. توفر الوحدات طريقة جديدة لتنظيم التعليمات البرمجية المصدرية بناءً على تحديد حدود المكونات، دون تضمين ملفات الرأس عبر "#include".
  • ماكرو __VA_OPT__ للتوسيع التكيفي لوحدات الماكرو المتغيرة اعتمادًا على وجود الرموز المميزة في وسيطة المتغير.
  • دعم المشغل "" للمقارنة الثلاثية.
  • دعم مُهيئات العناصر الافتراضية لحقول البت.
  • القدرة على التقاط تعبيرات لامدا "*هذا".

    البنية int_value {
    كثافة العمليات ن = 0 ؛
    السيارات getter_fn () {
    //سيء:
    // العودة [=]() { العودة ن؛ };

    // جيد:
    return [=, *this]() { return n; };
    }
    };

  • استدعاء العناصر بواسطة المؤشر (مؤشر إلى عضو)، باستخدام مؤشرات إلى كائنات مؤقتة محددة من خلال تعبير "const &".
  • عامل الحذف مع أداة التدمير الموضحة في المستند P0722.
  • يُسمح للفصول باستخدام معلمات القالب بدون نوع.

    هيكل فو {
    foo() = default;
    كونتيكسبر فو(int) {}
    };

    نموذج
    الحصول التلقائي على () {
    العودة و؛
    }

    get_foo(); // يستخدم المنشئ الضمني
    get_foo ()؛

  • تعبيرات لامدا غير المستمرة مع المنشئ.
  • السماح ببناء جملة القالب لتعبيرات لامدا ("auto f = []" (الأمراض المنقولة جنسيا::vector الخامس)").
  • القدرة على استخدام سلسلة حرفية في معلمات القالب.
  • دعم بناء جملة تهيئة النمط C - تتم تهيئة الحقول غير المدرجة بشكل صريح في قائمة التهيئة بشكل افتراضي.

    هيكل أ {
    int x ؛
    int ذ ؛
    إنت ض = 123؛
    };

    أ أ {.x = 1، .z = 2}؛ // الفأس == 1، المنعم يوسف == 0، الألف إلى الياء == 2

  • دعم لأعضاء بنية البيانات الفارغة.
  • دعم السمات المحتملة وغير المحتملة لإبلاغ المحسن باحتمالية تشغيل البنية الشرطية ("[[المحتمل]] إذا (عشوائي > 0) {").
  • القدرة على استخدام النطاقات لتهيئة القيم المتغيرة في حلقة "for".

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

  • الحساب التلقائي لحجم المصفوفة في الجديد ("new double[]{1,2,3}");
  • السمة "[[no_unique_address]]" التي لا تشغل فيها المتغيرات التي لا تحتوي على بيانات مساحة.
  • المؤشرات الذرية (std::atomic > و الأمراض المنقولة جنسيا :: الذرية >).
  • القدرة على استدعاء الوظائف الافتراضية في التعبيرات الشرطية.
  • دعم الوظائف الفورية التي يمكنها العمل فقط مع الثوابت.

    كونستيفال int sqr(int n) {
    العودة ن * ن؛
    }

    constexpr int r = sqr(100); // نعم
    كثافة العمليات س = 100 ؛
    int r2 = sqr(x); // خطأ: لا يمكن استخدام "x" كقيمة ثابتة

  • القدرة على استخدام constexpr مع الوظائف الافتراضية ("constexpr virtual int f() const {return 2; }").
  • في المكتبة القياسية:
    • تمت إضافة دعم لنوع char8_t لسلاسل UTF-8.
    • تمت إضافة بت ملفات الرأس (عمليات البت) والإصدار.
    • أصبح من الممكن الآن التحقق من بادئة ولاحقة السلاسل النصية (starts_with، end_with).
    • تمت إضافة سمات std::remove_cvref وstd::unwrap_reference وstd::unwrap_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::assume_aligned.
    • تمت إضافة دعم للمصفوفات إلى std::make_shared.
    • تمت إضافة وظيفة std::to_array لتحويل الكائنات الشبيهة بالمصفوفة إلى std::array.
  • بناء جملة التعداد أكثر ملاءمة:

    فئة التعداد rgba_color_channel {أحمر، أخضر، أزرق، ألفا}؛

    ستد::string_view to_string(rgba_color_channel my_channel) {
    التبديل (my_channel) {
    باستخدام التعداد rgba_color_channel؛
    الحالة الحمراء: إرجاع "أحمر"؛
    الحالة الخضراء: إرجاع "أخضر"؛
    الحالة الزرقاء: إرجاع "أزرق"؛
    حالة ألفا: إرجاع "ألفا"؛
    }
    }

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

المصدر: opennet.ru

إضافة تعليق