2012-02-13 15 views
12

मैं सिर्फ draft of the C++11 standard के माध्यम से ब्राउज़ कर रहा था और पाया निम्नलिखित पेचीदा बयान (§13.6/8):संकेत पर एकल +

हर प्रकार के लिए T वहाँ मौजूद फार्म के उम्मीदवार ऑपरेटर कार्यों

T* operator+(T*); 

पॉइंटर पर यह "यूनरी +" ऑपरेटर कैसे समझा जाना चाहिए? क्या यह सामान्य मामले में सिर्फ एक नो-ऑप है, जिसे फिर भी ओवरलोड किया जा सकता है? या क्या यहां कुछ गहरा बिंदु है, मैं यहां याद कर रहा हूं?

उत्तर

8

अपने प्रश्न का उत्तर उद्धरण आप — §13.6/1 उद्धृत ऊपर सिर्फ एक पृष्ठ है:

उम्मीदवार ऑपरेटर कार्यों कि प्रतिनिधित्व निर्मित ऑपरेटरों खण्ड 5 में परिभाषित किया गया इस उपखंड में निर्दिष्ट कर रहे हैं । ये उम्मीदवार 13.3.1.2 में वर्णित ऑपरेटर ओवरलोड रिज़ॉल्यूशन प्रक्रिया में भाग लेते हैं और इसका उपयोग किसी अन्य उद्देश्य के लिए नहीं किया जाता है। [नोट: क्योंकि अंतर्निहित ऑपरेटर केवल गैर-वर्ग प्रकार के साथ संचालन करते हैं, और ऑपरेटर ओवरलोड रिज़ॉल्यूशन तब होता है जब एक ऑपरेंड अभिव्यक्ति में मूल रूप से कक्षा या गणना प्रकार होता है, ऑपरेटर ओवरलोड रिज़ॉल्यूशन केवल अंतर्निहित ऑपरेटर को हल कर सकता है एक ऑपरेंड में एक क्लास प्रकार होता है जिसमें ऑपरेटर के लिए उपयुक्त गैर-वर्ग प्रकार के लिए उपयोगकर्ता द्वारा परिभाषित रूपांतरण होता है, या जब किसी ऑपरेंड में एक गणना प्रकार होता है जिसे ऑपरेटर के लिए उचित प्रकार में परिवर्तित किया जा सकता है। यह भी ध्यान रखें कि इस उपखंड में दिए गए कुछ उम्मीदवार ऑपरेटर फ़ंक्शन अंतर्निहित ऑपरेटरों की तुलना में अधिक अनुमोदित हैं। जैसा कि 13.3.1.2 में वर्णित है, अंतर्निर्मित संकल्प द्वारा अंतर्निहित ऑपरेटर का चयन करने के बाद अभिव्यक्ति क्लॉज 5 में दिए गए अंतर्निहित ऑपरेटर की आवश्यकताओं के अधीन है, और इसलिए वहां दी गई अतिरिक्त अर्थपूर्ण बाधाओं के लिए। यदि एक अंतर्निहित उम्मीदवार ऑपरेटर फ़ंक्शन के रूप में एक ही नाम और पैरामीटर प्रकार वाले उपयोगकर्ता-लिखित उम्मीदवार हैं, तो अंतर्निहित ऑपरेटर फ़ंक्शन छिपा हुआ है और उम्मीदवार कार्यों के सेट में शामिल नहीं है। अंत टिप्पणी]

+0

तो 'टी * ऑपरेटर + (टी *); 'सदस्य या वैश्विक है? और लैम्ब्डा के मामले में -> '+ [] {};' मुझे क्या आश्चर्य है? धन्यवाद –

+0

@AngelusMortis: पॉइंटर्स के सदस्य नहीं हो सकते हैं; यह अंकगणितीय प्रकारों के लिए भाषा के बिल्टिन यूनरी 'ऑपरेटर +' का उपयोग करता है।और '+ [] {} 'का प्रकार' शून्य (*)() 'है, क्योंकि कैप्चरलेस लैम्ब्स पर यूनरी' ऑपरेटर + 'के रूप में लैम्ब्डा को फ़ंक्शन पॉइंटर में परिवर्तित करता है। – ildjarn

+0

प्रिय महोदय, मैं अभी भी थोड़ा उलझन में हूं, इसलिए lemme अपने बयान उद्धृत करके पूछता है -> "पॉइंटर्स के पास सदस्य नहीं हो सकते हैं" हां, लेकिन मैंने शुरू में सोचा था कि लैम्ब्स को क्लास प्रकारों (कंपाइलर्स द्वारा) ओवरलोडिंग 'ऑपरेटर()' में परिवर्तित किया जाता है, इसलिए मैंने सोचा कि वे सदस्य हो सकते हैं। अब आपका कथन "यह अंकगणितीय प्रकारों के लिए भाषा के बिल्टिन यूनरी 'ऑपरेटर +' का उपयोग करता है", मुझे यकीन है कि अंकगणितीय प्रकार मूल रूप से अभिन्न + फ्लोट प्रकार हैं, फिर अभिव्यक्ति -> '+ []()' -> 'ऑपरेटर + (some_unknown_type_I_don 't_know) '->' शून्य (*)()' –

0

ठीक है, आप इसे जो चाहें करें कर ओवरलोड सकता है, लेकिन इसके साथ एकल समरूपता के लिए बस नहीं है - ऑपरेटर। जैसा कि आप उल्लेख करते हैं, यह ज्यादातर समय का नो-ऑप है।

+3

क्या आप कर सकते हैं? _operator कक्षा या गणना प्रकार_ का तर्क होना चाहिए? – Lol4t0

8

+ संकेत पर rvalues ​​चीजों मोड़ के अलावा एक NOOP है। कभी-कभी यह उपयोगी है अगर आप सरणियों क्षय करना चाहते हैं या कार्य करता

int a[] = { 1, 2, 3 }; 
auto &&x = +a; 

अब x एक int*&&, न कि किसी int(&)[3] है। यदि आप टेम्पलेट्स पर x या +a पास करना चाहते हैं, तो यह अंतर महत्वपूर्ण हो सकता है। a + 0, विचार

struct forward_decl; 
extern forward_decl a[]; 
auto &&x = +a; // well-formed 
auto &&y = a + 0; // ill-formed 

अंतिम पंक्ति बीमार बनाई है क्योंकि एक सूचक के लिए कुछ भी जोड़ने की आवश्यकता है सूचक के बताया-टू वर्ग प्रकार पूरी तरह से परिभाषित किया जाना (क्योंकि यह sizeof(forward_decl) * N बाइट्स द्वारा अग्रिम) बराबर हमेशा नहीं है।

+0

यह नहीं है कि 'std :: move()' और 'std :: forward()' क्या करना है? तो अगर मैं इसे सही ढंग से समझता हूं ' ए' और 'std :: move (ए) 'वही करेगा? – LiKao

+1

@LiKao बिल्कुल नहीं।' चाल 'प्रकार को संरक्षित करता है, लेकिन केवल मूल्य श्रेणी को बदलता है। इसलिए' चाल (ए) 'एक रैल्यू उत्पन्न करेगा 'int [3] 'टाइप करें, टाइप' int * 'के रावल्यू नहीं। अब किसी फंक्शन में' move' को लागू करने से कुछ भी नहीं होता है ('फंक्शन टाइप और'' लाभा का उत्पादन) और विशेष रूप से सार्थक नहीं है I सोचें। –

+0

@LiKao: नहीं, 'std :: move' सरणी को संरक्षित करता है, जबकि यूनरी + इसे अस्वीकार करता है (और एक रैल्यू पॉइंटर उत्पन्न करता है) – Xeo

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