استاندارد C++20 تایید شده است

کمیته ISO برای استانداردسازی زبان C++ تایید شده استاندارد بین المللی "C ++ 20". قابلیت های ارائه شده در مشخصات، به استثنای موارد مجزا، پشتیبانی در کامپایلرها GCC, صدای عیار и مایکروسافت ویژوال C ++. کتابخانه های استاندارد پشتیبانی کننده C++20 در داخل پروژه پیاده سازی شده اند بالا بردن.

در دو ماه آینده، مشخصات مصوب در مرحله آماده سازی سند برای انتشار خواهد بود که در آن کار بر روی اصلاح ویراستاری غلط های املایی و املایی انجام می شود. در اوایل نوامبر، سند حاصل برای انتشار با نام رسمی ISO/IEC 14882:2020 به ISO ارسال خواهد شد. در همین حال، کمیته کار بر روی استاندارد بعدی C++23 (C++2b) را آغاز کرده است و در جلسه مجازی بعدی خود گزینه های احتمالی را بررسی خواهد کرد. نوآوری ها.

اصلی ویژگی های C ++ 20 (نمونه های کد):

  • "مفاهیم"، پسوندهای قالب اضافه شده است که به شما امکان می دهد مجموعه ای از الزامات پارامتر الگو را تعریف کنید که در زمان کامپایل، مجموعه آرگومان هایی را که می توان به عنوان پارامترهای الگو پذیرفت محدود می کند. این مفاهیم را می توان برای جلوگیری از تناقضات منطقی بین خصوصیات انواع داده های مورد استفاده در قالب و ویژگی های نوع داده پارامترهای ورودی استفاده کرد.

    قالب
    مفهوم EqualityComparable = نیازمند (T a, T b) {
    { a == b } -> std::boolean;
    { a != b } -> std::boolean;
    };

  • پذیرفته شده انبساط برای کار با ماژول هایی که می توانند به جای فایل های هدر استفاده شوند. ماژول ها روش جدیدی را برای سازماندهی کد منبع بر اساس تعریف مرزهای مؤلفه ها، بدون گنجاندن فایل های هدر از طریق "#include" ارائه می دهند.
  • ماکرو __VA_OPT__ برای بسط تطبیقی ​​ماکروهای متغیر بسته به وجود نشانه‌ها در آرگومان متغیر.
  • پشتیبانی از عملگر "" برای مقایسه سه طرفه.
  • پشتیبانی از مقداردهی اولیه عناصر پیش فرض برای فیلدهای بیتی.
  • امکان گرفتن لامبدا از عبارات "*this".

    ساختار int_value {
    int n = 0؛
    auto getter_fn() {
    //بد:
    // return [=]() { return n; };

    // خوب:
    return [=، *this]() { return n; };
    }
    };

  • فراخوانی عناصر توسط اشاره گر (Pointer-to-Member)، با استفاده از اشاره گرها به اشیاء موقتی که از طریق عبارت Const & تعریف شده اند.
  • اپراتور حذف با یک تخریبگر که در سند توضیح داده شده است P0722R1.
  • کلاس ها مجاز به استفاده از پارامترهای قالب بدون نوع هستند.

    struct foo {
    foo() = پیش فرض;
    constexpr foo(int) {}
    };

    قالب
    auto get_foo() {
    بازگشت f;
    }

    get_foo(); // از سازنده ضمنی استفاده می کند
    get_foo ()؛

  • عبارات لامبدا غیر پایدار با سازنده.
  • اجازه دادن به نحو الگو برای عبارات لامبدا ("auto f = [] (std::بردار v)").
  • امکان استفاده از لفظ رشته ای در پارامترهای قالب.
  • پشتیبانی از سینتکس اولیه سازی به سبک C - فیلدهایی که به صراحت در لیست اولیه فهرست نشده اند به طور پیش فرض مقداردهی اولیه می شوند.

    ساختار A {
    int x ؛
    int y;
    int z = 123;
    };

    A a {.x = 1، .z = 2}؛ // ax == 1، ay == 0، az == 2

  • پشتیبانی از اعضای خالی ساختار داده
  • پشتیبانی از ویژگی‌های محتمل و بعید برای اطلاع بهینه‌ساز در مورد احتمال راه‌اندازی ساختار شرطی ("[[احتمالا]] اگر (تصادفی > 0) {").
  • امکان استفاده از محدوده ها برای مقداردهی اولیه متغیرها در یک حلقه "for".

    برای (auto v = std:: vector{1, 2, 3}; auto& e : v) {

  • محاسبه خودکار اندازه آرایه در جدید ("new double[]{1,2,3}");
  • ویژگی «[[no_unique_address]]» که در آن متغیرهای بدون داده فضا را اشغال نمی‌کنند.
  • نشانگرهای اتمی (std::atomic > و std::atomic >).
  • امکان فراخوانی توابع مجازی در عبارات شرطی.
  • پشتیبانی از توابع فوری که فقط می توانند با ثابت ها کار کنند.

    consteval int sqr(int n) {
    بازگشت n * n;
    }

    constexpr int r = sqr(100); // خوب
    int x = 100;
    int r2 = sqr(x); // ERROR: 'x' نمی تواند به عنوان یک ثابت استفاده شود

  • امکان استفاده از constexpr با توابع مجازی (“constexpr virtual int f() const { return 2; }”).
  • در کتابخانه استاندارد:
    • پشتیبانی از نوع char8_t برای رشته های UTF-8 اضافه شده است.
    • بیت فایل های هدر (عملیات بیت) و نسخه اضافه شده است.
    • اکنون امکان بررسی پیشوند و پسوند رشته ها (شروع_با، پایان_با) وجود دارد.
    • ویژگی های 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 اضافه شد.
  • نحو شمارش راحت تر:

    enum class rgba_color_channel { قرمز، سبز، آبی، آلفا };

    std::string_view to_string(rgba_color_channel my_channel) {
    سوئیچ (my_channel) {
    با استفاده از enum rgba_color_channel.
    case red: بازگشت "قرمز"؛
    case green: بازگشت "سبز"؛
    case blue: بازگشت "آبی"؛
    case alpha: بازگشت "آلفا";
    }
    }

  • در نمایه ها، به دلیل رفتار نامشخص، استفاده از عملیات "،" ("a[b,c]") ممنوع است. پشتیبانی از اکثر عملیات با متغیرهای اعلام شده با کلمه کلیدی فرار، از جمله عملیات "++" و "-" با انواع استاندارد متوقف شده است.
  • تعداد موقعیت‌هایی را کاهش داد که در آن‌ها «نام نوع» برای نشان دادن وجود یک نوع مورد نیاز است.

منبع: opennet.ru

اضافه کردن نظر