في الآونة الأخيرة ، وافقت لجنة 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]") في الفهارس . لا يتم دعم معظم العمليات على المتغيرات المُعلنة بالكلمة الأساسية المخالفة ، بما في ذلك ++ الممنوعة والعمليات على الأنواع القياسية.
