int numeral -> सूचक रूपांतरण नियम


19

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

void f(double p) {}
void f(double* p) {}

int main()
{ f(1-1); return 0; }

MSVC 2017 यह संकलित नहीं करता है। यह एक अस्पष्ट अतिभारित कॉल है, जैसा 1-1कि वैसा ही है 0और इसलिए इसे परिवर्तित किया जा सकता है double*। अन्य चाल, जैसे 0x0, 0Lया static_cast<int>(0), काम भी नहीं करते हैं। यहां तक ​​कि const int Zero = 0कॉलिंग और कॉलिंग की घोषणा भी एक f(Zero)ही त्रुटि पैदा करती है। यह केवल ठीक से काम करता है अगर Zeroनहीं है const

ऐसा लगता है कि यही मुद्दा GCC 5 और उससे नीचे के लिए लागू होता है, लेकिन GCC 6 पर नहीं। मैं उत्सुक हूं अगर यह C ++ मानक, ज्ञात MSVC बग, या संकलक में एक सेटिंग का हिस्सा है। एक सरसरी गूगल ने परिणाम नहीं दिए।

जवाबों:


18

MSVC 1-1एक अशक्त सूचक स्थिरांक मानता है। यह C ++ 03 के लिए मानक द्वारा सही था, जहां मूल्य के साथ सभी अभिन्न निरंतर अभिव्यक्ति 0अशक्त सूचक स्थिरांक थे, लेकिन इसे बदल दिया गया था, ताकि केवल शून्य पूर्णांक लिटरेचर CG 11 के लिए CWG समस्या 903 के साथ अशक्त सूचक स्थिरांक हों । यह एक परिवर्तन है, जैसा कि आप अपने उदाहरण में देख सकते हैं और जैसा कि मानक में भी प्रलेखित है, देखें C ++ 14 मानक (N4140 का मसौदा) के [diff.cpp03.conv]

MSVC यह परिवर्तन केवल अनुरूप मोड में लागू होता है। इसलिए आपका कोड /permissive-ध्वज के साथ संकलित होगा , लेकिन मुझे लगता है कि परिवर्तन केवल MSVC 2019 में लागू किया गया था, देखें यहां

जीसीसी के मामले में, जीसीसी 5 सी ++ 98 मोड में चूक करता है, जबकि जीसीसी 6 और बाद में सी ++ 14 मोड में डिफ़ॉल्ट होता है, यही कारण है कि व्यवहार में परिवर्तन जीसीसी संस्करण पर निर्भर करता है।

यदि आप fअशक्त सूचक के साथ तर्क के रूप में कॉल करते हैं, तो कॉल अस्पष्ट है, क्योंकि अशक्त सूचक स्थिरांक को किसी भी सूचक प्रकार के अशक्त सूचक मान में परिवर्तित किया जा सकता है और इस रूपांतरण का रूपांतरण int(या अन्य अभिन्न प्रकार) के समान रैंक है को double


-1

कंपाइलर सही ढंग से [over.match] और के अनुसार काम करता है [conv] , अधिक विशेष रूप से [conv.fpint] और [conv.ptr] के ।

एक मानक रूपांतरण अनुक्रम है [ब्ला ब्ला] शून्य या एक [...] अस्थायी-अभिन्न रूपांतरण, सूचक रूपांतरण, [...]।

तथा

पूर्णांक प्रकार का एक या अनकैप्ड एन्यूमरेशन प्रकार का एक प्रचलन एक फ़्लोटिंग-पॉइंट प्रकार के एक प्रचलन में परिवर्तित किया जा सकता है। परिणाम संभव है यदि संभव हो [ब्ला ब्ला]

तथा

एक शून्य सूचक स्थिरांक शून्य या [...] के साथ पूर्णांक शाब्दिक है। एक अशक्त सूचक स्थिरांक को एक सूचक प्रकार में परिवर्तित किया जा सकता है; परिणाम उस प्रकार का शून्य सूचक मान है [blah blah]

अब, अधिभार संकल्प के बीच में सबसे अच्छा मैच चुनना है सभी के उम्मीदवार कार्यों के (जो कि एक मजेदार विशेषता के रूप में, कॉल स्थान तक भी पहुंचने की आवश्यकता नहीं है!)। सबसे अच्छा मैच सटीक मापदंडों के साथ या वैकल्पिक रूप से, सबसे कम संभव रूपांतरण है। शून्य या एक मानक रूपांतरण हो सकता है (... प्रत्येक पैरामीटर के लिए), और शून्य एक से "बेहतर" है।

(1-1) मूल्य के साथ पूर्णांक शाब्दिक है 0

आप शून्य पूर्णांक शाब्दिक को या तो (या ) में से प्रत्येक में बदल सकते हैं , ठीक एक रूपांतरण के साथ। इसलिए, यह मानते हुए कि इन कार्यों में से एक से अधिक घोषित किया गया है (जैसा कि उदाहरण में मामला है), एक से अधिक उम्मीदवार मौजूद हैं, और सभी उम्मीदवार समान रूप से अच्छे हैं, कोई सर्वश्रेष्ठ मैच मौजूद नहीं है। यह अस्पष्ट है, और कंपाइलर शिकायत करने के बारे में सही है।doubledouble*nullptr_t


1
कैसे है 1-1एक पूर्णांक शाब्दिक ? यह एक अभिव्यक्ति है जिसमें मूल्य 1और एक -ऑपरेटर के साथ दो पूर्णांक शाब्दिक हैं ।
अखरोट

@walnut: आप शायद "बाइनरी-अंकों, ऑक्टल-अंकों, अंकों, या हेक्साडेसिमल-अंकों" के अजीब शब्दों को देखें । यह "स्पष्ट" कुछ के लिए एक बहुत ही अनैतिक शब्द है, जो ऐसा कुछ सुझाता है जो मामला नहीं है (यानी माइनस कैरेक्टर को छोड़कर)। सिर्फ "अंकों" के साथ, और "अंक" (0 में से एक 9) की परिभाषा के अनुसार, किसी भी नकारात्मक शाब्दिक (जैसे -1) होना संभव नहीं है । हालांकि , चूंकि डिफ़ॉल्ट प्रकार पर हस्ताक्षर किए गए हैं , हालांकि, स्पष्ट रूप से आवश्यक है, और यह प्रदर्शनकारी रूप से संभव है (और सार्वभौमिक रूप से स्वीकृत) भी।
डेमोन

1
मैं मानक लिंक में दिखाए गए पूर्णांक-शाब्दिक के लिए व्याकरण का उल्लेख कर रहा हूं , जो मेल नहीं खाता 1-1। C ++ में नकारात्मक पूर्णांक शाब्दिक नहीं है। -1एक 1पूर्णांक शाब्दिक (हस्ताक्षरित प्रकार का) और एक -संयुक्त ऋण ऑपरेटर से बना एक अभिव्यक्ति है । Cppreference.com पर "नोट्स" अनुभाग भी देखें ।
अखरोट

यह निश्चित रूप से सच है कि व्याकरण के पास यह नहीं है, लेकिन यह व्यापक रूप से असंगत है। आवश्यकता से और परिभाषा के द्वारा, सी ++ बहुत ज्यादा है , नकारात्मक शाब्दिक के बाद से जब तक आप स्पष्ट संलग्न u, अपने शाब्दिक है, परिभाषा के अनुसार, पर हस्ताक्षर किए। हस्ताक्षरित प्रकारों में नकारात्मक मान होते हैं (संभावित मानों का लगभग 50% नकारात्मक होता है)। यह दुर्भाग्यपूर्ण है कि व्याकरण (एक कारण के लिए जो मुझे नहीं पता होगा) इस तरह से भ्रामक है, और यद्यपि तकनीकी रूप से (व्याकरण के अनुसार) -1 एक सकारात्मक शाब्दिक है, नकारात्मक है, अन्य सभी तरीकों से, निश्चित रूप से एक नकारात्मक है शाब्दिक। बहुत कुछ 3 + 4 की तरह एक शाब्दिक है।
डेमोन

वैसे - मैंने कोशिश की 0U। वही मुद्दा। मैंने जो कोशिश नहीं की वह एक enumमूल्य है। हो सकता है कि एक नामित व्यक्ति ने चीजों को बदल दिया हो। मैं के साथ एक लंबी अभिव्यक्ति लेखन समाप्त हो गया decltypeऔर remove_reference
user1334767
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.