البق C ++ 20. نتائج الاجتماع في بلفاست

في اليوم الآخر كان هناك اجتماع للجنة توحيد لغة البرمجة C ++ في بلفاست. تم نقل حوالي 400 تعليق على C ++ 20 من ممثلي الدول إلى اللجنة ، وتمكن نصفهم من التعامل معها.

تحت الخفض ، تنتظر نتائج مناقشات التعليقات الروسية (نعم ، تعليقاتك على C ++ 20) ، وبعض التعليقات من بلدان أخرى ، وبالطبع C ++ 23 الجديد المناسب (المنفذون!).

كل تلك المشكلات مع C ++ التي ذكرها الأشخاص على الموقع stdcpp.ru ، أو في الدردشة ProCxx ، أو في العمل في Yandex.Taxi ، أو شخصيًا في المؤتمرات ، قمنا بإضفاء الطابع الرسمي على شكل تعليقات على C ++ 20. وماذا جاء منه ...

std :: atomic <int> a {}؛ و std :: atomic <int> b؛


قد يبدو غريباً ، لكن لم يتم تهيئة المتغيرات a و b إلى 0. لتهيئة المتغير الذري إلى الصفر ، كان من الضروري كتابة std :: atomic <int> مع {0}؛

هذا السلوك غير واضح تمامًا ، وأحرق العديد من المطورين أنفسهم. قبلت اللجنة ملاحظتنا بشأن المعيار ، وفي C ++ 20 ، ستقوم المنشئات الافتراضية لـ std :: atomic_flag و std :: atomic بتهيئة المتغيرات في حالة واضحة و T () ، على التوالي.

الأمراض المنقولة جنسيا :: غسيل


بدءًا من C ++ 17 ، يحتوي المعيار على وظيفة مخيفة std :: launder. ظن أشخاص من اللجنة أن مطوري المكتبات العاديين والمستخدمين العاديين سيتعرفون على كيفية التعامل معها.

في الممارسة العملية ، اتضح أنه في بعض الحالات لا يمكن استخدام هذه الوظيفة. من غير الواضح للغاية أنه مطلوب من حيث المبدأ:

struct C { const int c; }; std::vector<C> v = {C{1}}; v.pop_back(); v.push_back(C{2}); assert(v.back().c == 2); // ]:-> 

إذا اتبعت حرف المعيار بدقة ، فاعتمادًا على تطبيق المكتبة القياسية وميزات برنامج التحويل البرمجي ومرحلة القمر ، قد يمر التأكيد أو يتعطل.

عند مناقشة المشكلة ، اتضح أن التحسين ، الذي من أجله وصف المعيار مثل هذا السلوك الغريب ، تم تنفيذه فقط في أحد المترجمين ولم يحقق زيادة ملموسة في الأداء.

لذلك ، بدءًا من C ++ 20 ، يمكنك تخزين الهياكل بأمان مع روابط وحقول ثابتة في الأمراض المنقولة جنسياً :: اختياري ، الأمراض المنقولة جنسيا :: البديل ، الأمراض المنقولة جنسيا :: ناقلات ، الأمراض المنقولة جنسيا :: deque ، الخ : غسيل.

* هذا في الصانعين


هذا واحد من التعليقات التي ينتظرنا فيها الفشل:

 struct C { C(C&& other) noexcept : initial_(other.initial_) , secondary_(other.initial_) // O_O {} int initial_; int secondary_; }; 

وفقًا للقواعد الحالية ، في السطر مع O_O ، المترجم له الحق في افتراض أن & other == هذا ، وبالتالي ، سطر واحد أعلاه ، نعيد كتابة قيمة other.initial_ ويجب إعادة قراءتها.

بمعنى آخر ، المترجم لديه الحق في افتراض أن الفئة التي لم يتم إنشاؤها بعد مستعارة بالمعلمة التي تم بناء الكائن منها ، وبسبب هذا يمكنها إنشاء كود غير مثالي.

بعض المترجمين (على سبيل المثال ، GCC) ، يعتقدون أن المستخدمين لا يكتبون مثل هذا العار ، ويعتقدون أن الاسم المستعار غير ممكن.

رفضت اللجنة ملاحظتنا "لنفترض أن التعرج غير ممكن". كما اتضح فيما بعد ، تحتوي بعض قواعد الشفرة على اختراقات مخيفة حيث & == هذا ، والناس ليسوا مستعدين بعد لنقول وداعًا لهم.

المشغل <=> والبرمجة المدمجة


لكي يعمل مشغل سفينة الفضاء ، فأنت بحاجة إلى ملف الرأس <compare>. ومع ذلك ، لم يكن في قائمة ملفات الرأس المتاحة على أي منصات (على ما يسمى التطبيقات القائمة بذاتها للمكتبة القياسية التي يمكن استخدامها على أي الحديد).

الآن هو في القائمة :)

الباقي


وفقًا لتعليقاتنا الأخرى ، تم إصدار الحكم "ليس في C ++ 20":
* أردنا استخدام __func__ في constexpr.
* أردنا ألا يستخدم المفهوم النوع غير المكتمل ، لأنه بخلاف ذلك تحصل على انتهاكات متعددة لـ ODR. لكن الملاحظة كان لها تأثير إيجابي غير متوقع: يقوم المترجمون الآن بإصدار تحذير إذا كنت تستخدم النوع غير الكامل المطلوب.
* أردنا تصحيح عامل التعيين في std :: string حتى لا تحدث مثل هذه الفوضى:

 basic_string::operator=(charT c): double d = 3.14; std::string s; s = d; // Compiles 

اقترحت اللجنة كتابة ورقة منفصلة وتصحيح ذلك بعد C ++ 20.
* أردنا قتل مهمة الخطوط المؤقتة في الأمراض المنقولة جنسياً :: string_view:
 std::string foo(); std::string_view sv; sv = foo(); // Compiles... dangling reference 

والنتيجة هي نفس الملاحظة السابقة: اقترحت اللجنة كتابة ورقة منفصلة وتصحيح ذلك بعد C ++ 20.
* طلبنا ترجمة الشفرة التالية:

 #include <type_traits> template <typename... Xs> auto f (Xs...) -> std::invoke_result_t<Xs...>; 

قيل لنا أن كل شيء معقد ، لا يوجد عملياً أي فرصة لإصلاح C ++ 20.

تعليقات من بلدان أخرى


من التغييرات المهمة: إضافة مُنشئات لـ std :: span من الأنواع التي تفي بمفهوم النطاقات :: contiguous_range. حتى الآن يمكن إنشاء span ضمنياً من std :: vector و std :: string. لقد أضفنا أيضًا المُنشئ std :: string_view من متكررين يفيان بمفهوم النطاقات :: contiguous_iterator.

كانت التعديلات المرحة تتوقع <compare>. على مدار السنوات الثلاث الماضية ، تغير المشغل <=> كثيرًا. لم يعد يشارك في مقارنات المساواة ، وبالتالي ، لم يعد هناك حاجة إلى ثلث محتويات <compare>. لاحظت عدة دول هذا - لقد خفضت المعيار.

تغيير كبير تسلل إلى معلمات قالب غير النوع. في C ++ 20 ، سيكون من الممكن اجتياز أي فئات تقريبًا (انظر P1907) مع destexpr destructor وأعضاء الجمهور كمعلمة قالب ، حتى إذا كانت الفئة تحتوي على أنواع الفاصلة العائمة أو الروابط.

أضفنا أيضًا الدالة const المفقودة إلى أجزاء مختلفة من المعيار ، وقمنا بتغيير أسماء وترتيب وسيطات بعض الوظائف الجديدة إلى C ++ 20. هناك أيضًا العديد من عمليات التحرير للمفاهيم والنطاقات والاختصارات للنص القياسي والأشياء الصغيرة الأخرى.

أرقام TS


تمكنت أنا و ZaMaZaN4iK من تحريك اللجنة بوثيقة C ++ Numerics Work In Progress. توجد الآن خطط Napoleonic لـ C ++ 23 لمنح المستخدمين مجموعة من الأنواع الجديدة من الأرقام (wide_integer ، عدد صحيح ، عقلاني) ، جنبًا إلى جنب مع الأساليب المساعدة ذات المستوى المنخفض للعمل مع التدفقات الزائدة والأسماء المستعارة المريحة.

قيل لي لإعداد عرض للاجتماع التالي مع مقدمة للأفكار للجنة بأكملها.

منفذي


المنفذون هي واحدة من أولويات C ++ 23. إنها ضرورية للبرمجة التفاعلية ، للبرمجة غير المتزامنة (الشبكة ، القرص ، العمليات ...) ، فهي أساس sheduling coroutine ويجب أن توفر واجهة واحدة لمكتبات الطرف الثالث.

في الوقت نفسه ، يجب على المسؤولين التنفيذيين تحسين الخوارزميات لتنفيذها الداخلي. على سبيل المثال ، للرمز:

 template <std::input_range Range> void MySort(Range& data) { namespace stdr = std::ranges; std::sort(GetGlobalExecutor(), stdr::begin(data), stdr::end(data), 42); } 

يمكن إرجاع الدالة GetGlobalExecutor ():
* المنفذ المفرد مترابطة - يجب تنفيذ std :: sort المعتادة على مؤشر الترابط الخاص به ؛
* منفذ متعدد مؤشرات الترابط - يجب إجراء الفرز المتوازي ؛
* منفذ GPU - يجب نقل البيانات إلى ذاكرة بطاقة الفيديو ، وفرزها هناك وإرجاع البيانات ؛
* NUMA المنفذ - ...
* ...

حتى الآن ، لتنفيذ هذه الوظيفة ، تحتاج إلى القيام بـ "كائنات تخصيص التخصيص" (CPO) المخيفة ، وتحويل كل خوارزمية إليها. لم تعجب اللجنة ذلك ...

لكن على الأقل وافقوا مسبقا على P0443 - الواجهة الأساسية. سوف تحتاج إلى كتابة جميع الجمل اللاحقة للمنفذين في شكل تصحيحات لـ P0443.

بدلا من المجاميع


الآن يتم فصلنا عن C ++ 20 من خلال اجتماع لجنة واحد فقط. فقط قليلاً اليسار ...

حسنًا ، كل من يريد الدردشة مع ممثلي اللجنة على الهواء مباشرة - انظر إلى مؤتمرات mitaps و C ++ (*) :
* كورهارد في مينسك
* سي ++ سيبيريا 2020
* C ++ روسيا 2020
* شارع Petersburg C ++ مجموعة المستخدم
* C ++ Meetup 2019 في موسكو

(*) الاختراق مدى الحياة: لا يتعين عليك دفع ثمن تذكرة المؤتمر إذا كنت متحدثًا.

Source: https://habr.com/ru/post/ar474716/


All Articles