अंतिम अद्यतन:2026-10-12
C++20 constexpr और comma एक्सप्रेशन¶
C++20那些事 - constexpr और comma expr¶
C++20 ने कई नई विशेषताएँ पेश कीं, जिनसे compile-समय क्षमता और कोड सुरक्षा और सुदृढ़ हुई। यह लेख दो महत्वपूर्ण परिवर्तनों पर गहराई से चर्चा करेगा: constexpr फ़ंक्शन में exception handling और subscript ऑपरेटर में comma ऑपरेटर का deprecation।
नोट: आलसी लोगों के लिए, इस सेक्शन के कोड उदाहरण और संबंधित दस्तावेज़ 星球 पर अपडेट किए गए हैं, रुचि हो तो जुड़ जाएँ।
1. constexpr फ़ंक्शन में try-catch exception handling समर्थन का परिवर्तन¶
C++20 से पहले, constexpr फ़ंक्शन में try-catch ब्लॉक का उपयोग नहीं हो सकता था, यह सीमा std::array जैसे कुछ स्टैंडर्ड लाइब्रेरी कंटेनरों की compile-समय प्रक्रिया क्षमता में बाधक थी। C++20 ने इसे सुधारा, constexpr फ़ंक्शन में try-catch ब्लॉक के उपयोग की अनुमति दी, और constant expression के संदर्भ में इन exception handling संरचनाओं को नज़रअंदाज़ किया जाता है। जब constant expression गणना में exception फेंका जाता है, तो कंपाइलर त्रुटि देता है।
इस परिवर्तन का मुख्य उद्देश्य स्टैंडर्ड लाइब्रेरी के कंटेनरों को constexpr समर्थन दिलाना है, जैसे std::array, साथ ही भविष्य में compile-समय पर अधिक exception handling समर्थन की नींव रखना।
उदाहरण:
constexpr int SafeDivide(int a, int b) {
if (b == 0) {
throw std::runtime_error("Division by zero!"); // 当除数为0时抛出异常
}
return a / b;
}
constexpr int ComputeQuotient(int x) {
try {
return SafeDivide(100, x); // 尝试除法运算
} catch (const std::runtime_error&) {
return -1; // 捕获除零异常并返回 -1
}
}
उपरोक्त कोड C++20 से पहले compile नहीं होता था, तो C++20 इस व्यवहार के लिए क्या करता है, नीचे दिए दो परिणामों का अंदाज़ा लगा सकते हैं:
2. Subscript ऑपरेटर में comma ऑपरेटर का deprecation¶
C++20 का दूसरा परिवर्तन है subscript ऑपरेटर में comma ऑपरेटर के उपयोग का deprecation। पुराने C++ संस्करणों में, एक्सप्रेशन array[x, y] में comma ऑपरेटर y को subscript की तरह array या कंटेनर को दे देता था, और x नज़रअंदाज़ हो जाता था। हालांकि, इस उपयोग से कोड समझना कठिन हो जाता है, और भविष्य के multi-dimensional arrays के क्रियान्वयन में बाधा आती है। इसलिए, C++20 से, subscript ऑपरेटर में comma ऑपरेटर deprecated है, जब तक कि parenthesis से priority स्पष्ट रूप से न दी गई हो, जैसे array[(x, y)]।
उदाहरण कोड:
इस उदाहरण में, arr[(i, j)] में parenthesis का उपयोग comma ऑपरेटर की priority स्पष्ट करने के लिए किया गया है, यह सुनिश्चित करते हुए कि j subscript की तरह array को दिया जाए। C++17 में, arr[i, j] की अनुमति थी, लेकिन C++20 में ऐसे उपयोग से deprecation चेतावनी मिलेगी। इस तरीके से कोड का व्यवहार सुसंगत रहता है और C++20 के नए स्टैंडर्ड के अनुरूप होता है।
यदि comma ऑपरेटर का उपयोग किया जाए तो कंपाइलर चेतावनी देगा:
common.cc:9:10: warning: top-level comma expression in array subscript is deprecated [-Wcomma-subscript]
9 | arr[i, j] = 10; // C++17 中合法,C++20 中弃用
| ^
सारांश¶
C++20 के ये परिवर्तन, विशेष रूप से constexpr फ़ंक्शन में exception handling समर्थन और subscript ऑपरेटर में comma ऑपरेटर का deprecation, compile-समय क्षमता और कोड की पठनीयता बढ़ाने के लिए हैं। यदि आपका कोड इन पुरानी विशेषताओं पर निर्भर है, तो C++20 के नए स्टैंडर्ड के अनुरूप ढलने के लिए समय रहते समायोजन कर लेना बेहतर है।
संबंधित विषय¶
- C++20 coroutines परिचय | C++那些事
- C++20 channel व्यवहारिक उपयोग | C++那些事
- C++20 Concepts अवधारणा | C++那些事
- C++20 byte order endian | C++那些事
- C++20 Lambda एक्सप्रेशन (भाग 1) | C++那些事
- C++20 Modules मॉड्यूल | C++那些事
- C++20 Ranges लाइब्रेरी | C++那些事
- C++20 std::span डिज़ाइन और जाल | C++那些事
- C++20 नई विशेषताओं की जानकारी | C++那些事
- C++20 [[likely]] और [[unlikely]] | C++那些事