Monday 15 March 2010

c++ - Type of '?:' if the first operand is a constant expression -


निम्नलिखित कोड पर विचार करें:

  शून्य एफ (फ्लोट x) {x * (true 1.f: 0.0); }   

प्रकार declval (bool) है? घोषणा (फ्लोट): घोषित (डबल) है <कोड> डबल सी ++ मानक के अनुसार [expr.cond]।

क्या इसका मतलब यह है कि ऊपर वाला कोड होना चाहिए के बराबर:

  शून्य एफ (फ्लोट x) {डबल (एक्स) * 1.0; }   

या कोई ऐसा वक्तव्य है, जो कि ?: के पहले ऑपरेंड के मामले में अनुकूलन की अनुमति देता है, एक संकलित समय निरंतर अभिव्यक्ति है?

एक सी ++ कंपाइलर उपयुक्त रूप में अनुकूलित कर सकता है, बशर्ते कि वह किसी अनुरूप प्रोग्राम के "निरीक्षण व्यवहार" को बदल नहीं सकता (§1.9 पी 1, तथाकथित "जैसा कि" नियम)।

उदाहरण के लिए, यदि किसी दिए गए प्लेटफार्म पर यह ज्ञात है कि 1.0 से गुणा करना एक जाप की क्षमता के बिना एक पहचान परिवर्तन है, तो गुणा वास्तव में प्रदर्शन करने की आवश्यकता है (यह किसी दिए गए आर्किटेक्चर के लिए सच हो सकता है या नहीं, क्योंकि यह संभव है कि 1.0 से एक एनएएन मान को गुणा करके जाल हो सकता है। हालाँकि, कंपाइलर किसी भी अन्य ऑपरेशन के गुणन को प्रतिस्थापित कर सकता है जो समान परिस्थितियों में एक ही जाल पैदा करेगा ।)

जाल की अनुपस्थिति में और मानते हुए कि गुणन 1.0 एक पहचान परिणत है, आपके फ़ंक्शन के पूरे शरीर को f समाप्त किया जा सकता है, क्योंकि मानक को सेट की आवश्यकता है फ्लोट मान का डबल मान (संभवत: एक ही सेट) के सेट का एक सबसेट है। नतीजतन, फ्लोट- & gt; डबल- & gt; फ़्लाट राउंड ट्रिप मूल मूल्य या जाल पर लौट जाना चाहिए। (§3.9.1p8: "प्रकार फ्लोट के मूल्यों का सेट, प्रकार डबल के मानों के सेट का एक सबसेट है"। §4.8p1: "एक प्रावल फ्लोटिंग प्वाइंट प्रकार का एक अन्य फ्लोटिंग प्वाइंट प्रकार के प्राइवेट में परिवर्तित किया जा सकता है। यदि स्रोत मान को गंतव्य प्रकार में ठीक तरह से दर्शाया जा सकता है, रूपांतरण का नतीजा यह है कि सटीक प्रतिनिधित्व। ")

हाँ, अनुकूलन संभव हो सकता है लेकिन उस प्रकार के प्रकार को प्रभावित नहीं करता है: <: अभिव्यक्ति, उस प्रकार के मामले में (उदाहरण के लिए, यदि अभिव्यक्ति का उपयोग टेम्प्लेट कटौती के लिए या Decltype )।

No comments:

Post a Comment