से लिया जाता है सी ++ में, त्रुटि arraySize(y)
करने के लिए कॉल, लेकिन y
खुद की घोषणा नहीं है।
सरणी घोषणा में सीमाएं "परिवर्तित निरंतर अभिव्यक्ति" होनी चाहिए।
यदि आपका कंपाइलर y
की घोषणा स्वीकार करता है और बाद में आपको बताता है कि y
रनटाइम बाउंड की एक सरणी है, तो यह सी ++ कंपाइलर नहीं है। सी ++ के किसी भी अनुमोदित संस्करण में न ही रनटाइम के कोई सरणी नहीं हैं, न ही वर्तमान ड्राफ्ट।
arraySize(s.c)
और arraySize(ps->c)
के बीच महत्वपूर्ण अंतर यह है कि ps->c
(*ps).c
रूप में ही है और *
भिन्नता ऑपरेटर ps
पर lvalue करने वाली rvalue रूपांतरण है, जो एक निरंतर अभिव्यक्ति नहीं है की आवश्यकता है (और न ही &s
है, नीचे देखें)। शेष अभिव्यक्ति में लैवल्यू-टू-रावल्यू रूपांतरण शामिल नहीं है, सरणी लैवल्यू सीधे संदर्भ द्वारा बाध्य है।
एक निरंतर अभिव्यक्ति है या तो एक glvalue कोर निरंतर अभिव्यक्ति जिसका मूल्य (के रूप में नीचे वर्णित) एक इकाई एक निरंतर अभिव्यक्ति का एक अनुमति दी परिणाम है कि को संदर्भित करता है, या एक prvalue कोर निरंतर अभिव्यक्ति जिसका मूल्य एक वस्तु जहां है, उस वस्तु और उसके subobjects के लिए:
संदर्भ प्रकार से प्रत्येक गैर स्थैतिक डेटा सदस्य एक इकाई एक निरंतर अभिव्यक्ति का एक अनुमति दी परिणाम है कि करने के लिए संदर्भित करता है, और
मैं f ऑब्जेक्ट या सबोबजेक्ट पॉइंटर प्रकार का है, इसमें स्थिर स्टोरेज अवधि वाले ऑब्जेक्ट का पता, ऐसी ऑब्जेक्ट (5.7) के अंत में पता, फ़ंक्शन का पता, या शून्य सूचक मान होता है।
एक इकाई अगर यह स्थिर भंडारण अवधि के साथ एक वस्तु या तो एक अस्थायी वस्तु नहीं है या एक अस्थायी वस्तु जिसका मूल्य काफ़ी फाई तों ऊपर की कमी है, या यह एक है कि एक निरंतर अभिव्यक्ति का एक अनुमति दी परिणाम है फ़ंक्शन।
जाहिर ps
स्वत: भंडारण अवधि के साथ एक वस्तु का पता होता है, तो यह constexpr
घोषित नहीं किया जा सकता है। लेकिन सब कुछ, आपको लगता है कि चाहते हैं arraySize(s.c)
पैरामीटर एक निरंतर अभिव्यक्ति या तो नहीं है, क्योंकि यह स्थिर भंडारण का एक उद्देश्य के लिए एक संदर्भ है और नहीं काम कर रहा है, तो आप S s; S* ps = &s;
static S s; constexpr S* ps = &s;
को
(बदल दूसरी ओर शुरू कर देना चाहिए अवधि)
स्रोत
2015-01-22 04:27:48
त्रुटि क्या है? –
अच्छी तरह से मैं स्टंप हो गया हूं ... 'sc' और 'ps-> c' दोनों में एक ही प्रकार है, जैसा कि' टाइपिड (एससी) .name()' या 'टाइपिड (ps-> c) .name द्वारा छोड़ा गया है() ', यानी'जी ++ – vsoftco
के लिए A10_c' उसे कुछ अतिरिक्त काला कर करने के लिए: यदि आप कर' arraySize() 'एक संदर्भ-टू-स्थिरांक, निम्नलिखित compiles पैरामीटर:' चार y [arraySize (decltype (ps-> ग) {})]; ' – Quentin