मैं हाल ही में P4313 R1 की जाँच की, यह एक मानक प्रस्ताव है जो C++26 एनोटेशन के माध्यम से enums के लिए बिटमास्क ऑपरेशन जोड़ता है। मुख्य अवधारणा `[[=std::bitmask_type]]` का उपयोग करके बिटवाइज ऑपरेटरों को स्वचालित रूप से जनरेट करना है, जिससे मैन्युअल इंप्लीमेंटेशन की आवश्यकता खत्म हो जाती है। हालाँकि, C++ कंपाइलर इंटीग्रल टाइप्स पर बिटवाइज ऑपरेशन को खुशी-खुशी कलकुलेट करते हैं, एक महत्वपूर्ण विवरण इंटीग्रल प्रोमोशन से संबंधित है। `int` से छोटे टाइप्स, जैसे कि `short`, ऑपरेशन होने से पहले `int` में प्रोमोट हो जाते हैं। इसका मतलब है कि छोटे टाइप्स पर ऑपरेशन का रिजल्ट टाइप डिफ़ॉल्ट रूप से `int` होता है, जिससे अनपेक्षित बेहेवियर से बचने के लिए मूल टाइप में वापस `static_cast` की आवश्यकता होती है। इसके अलावा, `bool` अनियमित खतरे पैदा करता है। बूलियन कन्वर्शन बिट पैटर्न को ट्रंक नहीं करता; बल्कि यह किसी भी अशून्य मान को `true` (इंटीग्रल मान 1) और शून्य को `false` में मैप करता है। इन नियमों को मिलाने से एक जिद्दत प्रकट होती है: `true` का कॉम्प्लीमेंट (`~true`) `true` को `int` (मान 1) में प्रोमोट करता है, टू कॉम्प्लीमेंट रिजल्ट `-2` कलकुलेट करता है, और चूंकि `-2` अशून्य है, बूलियन कन्वर्शन `true` लौटाता है। इसलिए, `static_cast(~true) == true`। यह बेहेवियर `bool` पर आधारित enums पर भी फैलता है, जैसे कि `[[=std::bitmask_type]]` के माध्यम से परिभाषित किए गए हैं, जो इस बात पर जोर देता है कि रॉबस्ट C++ डेवलपमेंट के लिए इन आंतरिक कन्वर्शनों को समझना कितना महत्वपूर्ण है।
स्रोत: Hacker News · HeadlinesBriefing द्वारा सारांशित