2016-09-01 14 views
18

यह this प्रश्न का एक अनुवर्ती है, this उत्तर की टिप्पणियों की अधिक सटीक रूप से।अस्वीकरण (शून्य()) में शून्य() वास्तव में क्या मतलब है?

decltype(void()) में वास्तव में क्या प्रतिनिधित्व करता है?
क्या यह फ़ंक्शन प्रकार, अभिव्यक्ति या जो कुछ भी प्रस्तुत करता है?

उत्तर

9

एक hyperlinked C++ grammar का उपयोग करना, decltype(void()) की पार्स है:

decltype(expression) 
decltype(assignment-expression) 
decltype(conditional-expression) 

... आपरेशन के आदेश से जुड़े कदमों में से बहुत से यहाँ जाना ...

decltype(postfix-expression) 
decltype(simple-type-specifier (expression-listopt)) 
decltype(void()) 

तो void()expression की तरह है यहां, विशेष रूप से postfix-expression

विशेष रूप से, के हवाले से खंड 5.2.3 [expr.type.conf] 2011 आईएसओ सी ++ मानक के पैरा 2:

अभिव्यक्ति T(), जहां T एक सरल प्रकार-विनिर्देशक या है typename-विनिर्देशक एक गैर सरणी पूरा ऑब्जेक्ट प्रकार या (संभवतः सीवी-योग्य) void प्रकार के लिए, निर्दिष्ट प्रकार है, जो मूल्य-प्रारंभ (8.5 है की एक prvalue बनाता है, कोई प्रारंभ void() मामले के लिए किया जाता है)।

तो void(), प्रकार void की अभिव्यक्ति है बस के रूप में int() प्रकार int (मूल्य 0 के साथ) की अभिव्यक्ति है। स्पष्ट रूप से एक शून्य अभिव्यक्ति का कोई मूल्य नहीं है, लेकिन यहां यह decltype का संचालन है, इसलिए इसका मूल्यांकन नहीं किया जाता है। decltype केवल अपने ऑपरेंड के प्रकार को संदर्भित करता है, न कि इसका मूल्य।

decltype(void())void प्रकार का जिक्र करने का एक वर्बोज़ तरीका है।

+2

@skypjack: सी ++ 11 मानक (या एक मसौदा), खंड 5.2.3 [expr.type.conv], अनुच्छेद 2. देखें * एक सरल-प्रकार-विनिर्देशक * खाली कोष्ठक के बाद "का एक प्रावधान बनाता है निर्दिष्ट प्रकार, जो मूल्यवान है (8.5; शून्य() मामले के लिए कोई प्रारंभिकता नहीं की जाती है) "। जैसे 'int() 'प्रकार' int' की अभिव्यक्ति है,' शून्य() 'प्रकार 'शून्य' की अभिव्यक्ति है। और चूंकि यह 'decltype' का संचालन है, इसका मूल्यांकन नहीं किया जाता है। 'decltype (शून्य()) 'प्रकार' शून्य 'का जिक्र करने का एक जटिल तरीका है। (याक, आप अपने उत्तर का विस्तार करना चाहते हैं कि कैसे 'शून्य()' अभिव्यक्ति है।) –

+1

@Yakk जैसा कि पहले से ही टिप्पणियों में उल्लिखित है, अधिक जानकारी के साथ उत्तर का विस्तार करने में मदद मिलेगी। सुझाव को बढ़ावा देने के लिए +1। धन्यवाद। – skypjack

+3

मैंने 'शून्य()' साधनों का स्पष्टीकरण जोड़ने की स्वतंत्रता ली है। सटीकता के लिए कृपया मेरे अपडेट की जांच करें। –

4

मैं @JoachimPileborg की comment कि लगता है के हवाले कर रहा हूँ इसे सही ढंग से व्याख्या करने के लिए:

मुझे लगता है कि मैं अब समझ से बाहर, decltype एक अभिव्यक्ति है, और नहीं एक प्रकार की जरूरत है। शून्य() वास्तव में यहां एक प्रकार नहीं है, लेकिन एक अभिव्यक्ति, एक सी-शैली कास्ट (जैसे कि int (12.34)) शून्य (शून्य) अभिव्यक्ति नहीं है इसलिए यह काम नहीं करता है। कंपाइलर अलग-अलग चीजों को पार करता है, संदर्भ पर निर्भर करता है, जब यह किसी प्रकार के रूप में पारदर्शी होने की अपेक्षा करता है, जब यह अभिव्यक्ति के रूप में अभिव्यक्त होने की अभिव्यक्ति की अपेक्षा करता है। sizeof() (कोष्ठक के साथ) सभी प्रकार के पहले की अपेक्षा करता है, अन्यथा इसे एक संश्लेषित अभिव्यक्ति के रूप में पार्स किया जाता है।

मैं क्रेडिट या प्रतिष्ठा की तलाश नहीं कर रहा हूं।
वैसे भी, मुझे लगता है कि उत्तर में यह एक दिलचस्प जवाब था जो भावी पाठकों के लिए एक समर्पित प्रश्न के लायक है।

+0

यदि आप प्रतिनिधि नहीं चाहते हैं, तो आप उत्तर को समुदाय विकी – AndyG

+0

@skypjack पर क्लिक कर सकते हैं "संपादित करें" पर क्लिक करें, फिर टेक्स्ट विंडो के नीचे "समुदाय विकी" बॉक्स को चेक करें – TemplateRex

+2

'शून्य()' सी-शैली नहीं है डाली।सी में, एक कलाकार में एक संश्लेषित प्रकार का नाम होता है जिसके बाद अभिव्यक्ति होती है, उदाहरण के लिए '(शून्य) 42'। 'शून्य()' में, प्रकार का नाम संश्लेषित नहीं होता है और इसके बाद अभिव्यक्ति नहीं होती है। –

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