2012-09-09 11 views
7

निम्नलिखित कोड पर विचार करें। लेकिन यह क्यों है? सिद्धांत रूप में, constexpr फ़ंक्शंस केवल अन्य constexpr कार्यों को कॉल कर सकते हैं। हालांकि, इस बात की कोई गारंटी नहीं है कि ऑपरेटरों को समेकित कार्य होंगे। उदाहरण के लिए, मान लीजिए कि मैं निम्नलिखित इंटरफेस के साथ किसी प्रकार डालते हैं:constexpr टेम्पलेट्स के साथ क्यों काम करता है?</p> <pre class="lang-cpp prettyprint-override"><code>template<typename T> constexpr inline T fma(T a, T b, T c) { return a * b + c; } </code></pre> <p>यह ठीक संकलित:

ऑपरेटरों + और * नहीं constexpr हैं। अगर मैं निम्नलिखित कोड लिखें:

fma(someType(), someType(), someType()); 

यह एक constexpr समारोह गैर constexpr कार्यों बुला रहा है क्योंकि संकलित करने के लिए असफल हो जाना चाहिए। लेकिन यह सिर्फ ठीक है। ऐसा क्यों है?

मैं -std = C++ 0x विकल्प के साथ MinGW के G ++ कंपाइलर का उपयोग कर रहा हूं।

+0

उदाहरण के लिए जहां यह स्पष्ट रूप से स्पष्ट है कि यह सबकुछ अनुकूलित नहीं कर सकता है, यह जीसीसी 4.7.1 के साथ संकलित करता है जब तीन तर्क इनपुट किए जाते हैं, और परिणाम मुद्रित होते हैं: http://ideone.com/aBRPU – chris

+0

इसे आज़माएं: 'constexpr someType dummy = fma (someType(), someType(), someType());';) – mfontanini

+0

ओह, मैंने अभी मानक में पाया है कि 'constexpr' फ़ंक्शंस अंतर्निहित रूप से इनलाइन हैं, यदि यह आपको स्थान बचाता है। – chris

उत्तर

5

यदि आप गैर-निरंतर अभिव्यक्तियों का उपयोग करके अपने कॉन्स्ट्रैक्स फ़ंक्शन को अपने तर्क के रूप में कहते हैं, तो फ़ंक्शन रनटाइम पर निष्पादित किया जाता है।

आप ऐसा करते हैं:

constexpr someType dummy = fma(someType(), someType(), someType()); 

यह असफल हो जायेगी, क्योंकि आप परिणाम के लिए मजबूर कर रहे हैं एक constexpr प्रकार में संग्रहीत करने के लिए। यह संकलन-समय में नहीं किया जा सकता है, इसलिए आपको एक संकलन त्रुटि मिलती है।

ध्यान दें कि यह होगा काम करता है, तो आप दोनों एक constexpr निर्माता और एक constexproperator+/*someType में प्रदान की है।

0

चूंकि टेम्पलेट्स अधिकतर उपयोग पर त्रुटियों के लिए चेक किए जाते हैं, केवल तभी जब आप इसे गैर-कॉन्सएक्स ऑपरेटर वाले किसी प्रकार के साथ उपयोग करते हैं तो यह त्रुटि होगी।

5

सी ++ 11 मानक की धारा 7.1.5.6 से:

If the instantiated template specialization of a constexpr function template or member function of a class 
template would fail to satisfy the requirements for a constexpr function or constexpr constructor, that 
specialization is not a constexpr function or constexpr constructor. [ Note: If the function is a member 
function it will still be const as described below. — end note ] If no specialization of the template would 
yield a constexpr function or constexpr constructor, the program is ill-formed; no diagnostic required. 

इसका मतलब यह है कि एक constexpr समारोह टेम्पलेट एक गैर constexpr कार्य करने के लिए खराब हो अगर यह जो यह नहीं हो बनाने के टेम्पलेट मानकों के साथ instantiated है एक वैध constexpr समारोह।

यदि यह एक वैध कॉन्स्टेक्स फ़ंक्शन नहीं होगा, इससे कोई फर्क नहीं पड़ता कि आपने जो टेम्पलेट पैरामीटर दिए हैं, तो संकलक शिकायत कर सकता है, लेकिन ऐसा नहीं है।

संबंधित मुद्दे