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


کمیته استاندارد سازی ISO C ++ استاندارد بین المللی "C ++ 20" را تصویب کرد. ویژگی های ارائه شده در مشخصات ، به جز موارد جداگانه ، در کامپایلرهای GCC ، Clang و Microsoft Visual C ++ پشتیبانی می شوند. کتابخانه های استاندارد C ++ 20 به عنوان بخشی از پروژه Boost اجرا می شوند.

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

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

  • "مفاهیم" اضافه شده ، پسوندهای الگویی که به شما امکان می دهد مجموعه ای از الزامات را برای پارامترهای الگو تعریف کنید ، که در زمان کامپایل ، مجموعه ای از آرگومان ها را که می توانند به عنوان پارامترهای الگو پذیرفته شوند ، محدود می کنند. می توان مفاهیم را برای جلوگیری از تناقض منطقی بین خصوصیات انواع داده های استفاده شده در الگو و خصوصیات انواع داده های پارامترهای ورودی استفاده کرد.
    
        الگوی 
       مفهوم EqualityComparable = نیاز دارد (T a، T b) {
           {a == b} -> std :: boolean؛
           {a! = b} -> std :: boolean؛
       }؛
    
    
  • شامل برنامه های افزودنی برای کار با ماژول ها است که می توانند به جای پرونده های هدر استفاده شوند. ماژول ها روش جدیدی را برای سازماندهی کد منبع بر اساس تعیین مرزهای م componentلفه ، بدون نیاز به # شامل پرونده های هدر ، ارائه می دهند.
  • ماکرو __VA_OPT__ برای گسترش تطبیقی ​​ماکروهای متغیر بسته به وجود نشانه ها در استدلال متغیر.
  • پشتیبانی از اپراتور "" برای مقایسه سه جانبه.
  • پشتیبانی از مقداردهندگان اولیه پیش فرض برای bitfield ها.
  • امکان گرفتن لامبدا عبارات "* این".
    
        ساختار int_value {
         int n = 0؛
         auto getter_fn () {
           // بد:
           // Return [=] () {Return n؛ }؛
    
    

    // خوب: Return [=, *this] () {Return n؛ }؛ } }؛

  • اشاره گر به عضو ، با استفاده از اشاره گرها برای اشیا temporary موقتی که از طریق عبارت "ساخت و ساز" تعریف شده اند.
  • عملگر حذف با تخریب کننده ، شرح داده شده در سند P0722R1.
  • کلاسها مجاز به استفاده از پارامترهای الگوی بی نوع هستند.
    
        ساختار فو {
         foo () = پیش فرض
         constexpr foo (int) {}
       }؛
    
    

    الگوی خودکار get_foo () { بازگشت f؛ }

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

  • عبارات لامبدا ناپایدار با سازنده.
  • اجازه استفاده از نحو الگو برای عبارات لامبدا ("auto f = [] (std :: vector v)").
  • امکان استفاده از اصطلاحات رشته ای در پارامترهای الگو.
  • پشتیبانی از نحو مقداردهی اولیه به سبک C – زمینه هایی که به صراحت در لیست اولیه قرار ندارند به طور پیش فرض مقدار دهی اولیه می شوند.
    
        ساختار A {
         int x ؛
         int y؛
         int z = 123؛
       }؛
    
    

    A a {.x = 1، .z = 2}؛ // a.x == 1 ، a.y == 0 ، a.z == 2

  • پشتیبانی از اعضای خالی ساختار داده ها.
  • پشتیبانی از ویژگیهای محتمل و بعید برای آگاه سازی بهینه ساز در مورد احتمال اجرای جمله شرطی ("[[likely]] if (random> 0) {").
  • امکان استفاده از دامنه ها برای مقداردهی اولیه مقادیر متغیر در یک حلقه "برای"
    
        for (auto v = std :: vector {1، 2، 3}؛ auto & e: v) {
     
  • محاسبه خودکار اندازه آرایه در جدید ("دو برابر جدید [] {1،2،3}") ؛
  • صفت "[[no_unique_address]]" که در آن متغیرهای بدون داده جا نمی گیرند.
  • اشاره گرهای اتمی (std :: atomic <shared_ptr > و std :: atomic <law_ptr >).
  • امکان فراخوانی توابع مجازی در عبارات شرطی.
  • پشتیبانی از عملکردهای فوری که فقط با ثابت می توانند کار کنند.
    
    
    

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

    constexpr int r = sqr (100)؛ // خوب int x = 100 ؛ int r2 = sqr (x) ؛ // خطا: '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، and std :: assume_aligned.
    • پشتیبانی از آرایه ها به std :: make_shared اضافه شد.
    • تابع std :: to_array برای تبدیل اشیا آرایه مانند به std :: array اضافه شد.
  • نحو راحت تر شمردن:
    
        enum کلاس rgba_color_channel {قرمز ، سبز ، آبی ، آلفا}؛
    
    

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

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

OpenNET


نظر شما