2014-12-30 10 views
12

<cinttypes> में, के बाद से सी ++ 11, वहाँ the following two भार के हैं:पेट कॉन्स्टेक्सर क्यों नहीं है?

std::intmax_t abs(std::intmax_t n); 
std::intmax_t imaxabs(std::intmax_t n); 

क्यों उन दो कार्यों constexpr नहीं हैं?

+0

ऐतिहासिक और संगतता कारणों के लिए –

+5

@ बेसिलस्टारनकेविच: क्या आप इनमें से किसी एक संगतता कारणों को समझा सकते हैं? –

+5

@ बेसिलस्टारनकेविच मैं इसे नहीं खरीदता हूं। एक संगत कंपाइलर को देखते हुए, कोड का एक कॉन्स्टेक्सर टुकड़ा उसी तरह काम करेगा जैसा कि यह उपयोग किया जाता है, यानी जब गैर-कॉन्स्टेक्स मूल्यों में पारित किया जाता है तो यह एक गैर-कॉन्स्टेक्सर वापस कर देगा। यदि यह इन कार्यों को constexpr (या constexpr अधिभार के साथ alteast) बनाने के लिए संगत करने के लिए बेहतर है तो वेक्टर के लिए चाल प्रशिक्षकों को शामिल करने के लिए बेहतर होगा। ऐसा होने के कारण यह नामस्थान का उपयोग करता है (इसलिए सी नहीं है) और केवल एक हेडर है जो केवल सी ++ 11 में प्रदान किया गया है, मैं कॉन्सएक्सप्रो ओवरलाड्स देखना चाहता हूं। – IdeaHat

उत्तर

4

मैं absconstexpr क्यों नहीं हो सकता और स्पष्ट रूप से gcc नहीं हो सकता है, तो मैं एक अच्छा कारण नहीं दे सकता। जब मैं इस कार्यक्रम के साथ gcc 4.9.2 का उपयोग करें:

#include <cstdlib> 
#include <cinttypes> 
#include <cassert> 

constexpr intmax_t abs3 = std::abs(3); 
constexpr intmax_t absneg3 = std::abs(-3); 
int main() 
{ 
    assert(abs3 == absneg3); 
} 

यह संकलित करता है तथा कोई चेतावनी या त्रुटियों के साथ पूरा करने चलाता है। आप try it here कर सकते हैं। हालांकि, clang++ (संस्करण 3.5.0) एक संकलन समय त्रुटि फेंकता है:

abs.cpp:6:20: error: constexpr variable 'abs3' must be initialized by a constant expression.

मुझे लगता है कि clang++ वास्तव में यह हो जाता है यहीं है, क्योंकि 27.9.2 [c.files] 2011 मानक के अनुभाग में, यह कहते हैं:

The contents of header are the same as the Standard C Library header , with the following changes:

— the header includes the header instead of , and

— if and only if the type intmax_t designates an extended integer type (3.9.1), the following function signatures are added:

intmax_t abs(intmax_t);

imaxdiv_t div(intmax_t, intmax_t);

which shall have the same semantics as the function signatures intmax_t imaxabs(intmax_t) and imaxdiv_t imaxdiv(intmax_t, intmax_t), respectively.

सी ++ मानक का current working draft में, के रूप में प्रकाशित 2014 संस्करण में, यह खंड 17.6.5.6 [constexpr.functions] में कहते हैं:

This standard explicitly requires that certain standard library functions are constexpr (7.1.5). An implementation shall not declare any standard library function signature as constexpr except for those where it is explicitly required.

तो परिणाम, अभी के लिए, यह है कि मानक के अनुसार ये फ़ंक्शन अभी भी constexpr नहीं हैं (जिसे आप जानते थे) लेकिन वे gcc कंपाइलर द्वारा प्रदर्शित किए जा सकते हैं।

+0

अधिक जानकारी के लिए [gcc और मिलान कार्यों को constexpr के रूप में माना जाता है] (http://stackoverflow.com/q/27744079/1708801)। जीसीसी ने इसे अनुमति दी क्योंकि उन्होंने सोचा था कि यह अनुमति दी जा रही है लेकिन यह नहीं था। –

1

सरल स्पष्टीकरण संभवतः कोई भी मानक लाइब्रेरी के हिस्से के रूप में सूचीबद्ध प्रत्येक फ़ंक्शन के माध्यम से नहीं चला, और constexpr बनाने के लिए प्रविष्टि को अपडेट किया।

एक मानक अद्यतन करना एक प्रक्रिया है जिसमें परिवर्तन का प्रस्ताव देने के लिए मानव प्रयास शामिल हैं और उन प्रस्तावों की समीक्षा और स्वीकृति प्राप्त की गई है। और इसका मतलब है, जब एक नई सुविधा जोड़ दी जाती है - और constexpr एक नई सुविधा है - उस सुविधा का उपयोग करने के लिए बाकी सब कुछ स्वचालित रूप से अपडेट नहीं किया गया है। इस विशेष मामले को मानक के भविष्य के विकास में भी अपडेट किया जा सकता है - यदि कुछ लोग अक्सर परिवर्तन के सेट का प्रस्ताव देने के लिए धन्यवाद देते हैं, तो कुछ अन्य लोग इसकी समीक्षा करने के कार्य को लेते हैं, और मतदान शक्ति वाले लोगों को विश्वास दिलाते हैं समिति को इसे स्वीकार करने के लिए।

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