तीन रूपांतरण हैं जिन्हें लैवल्यू ट्रांसफॉर्मेशन माना जाता है: लवल्यू-टू-रावल्यू, सरणी-टू-पॉइंटर, और फ़ंक्शन-टू-पॉइंटर। आप इस "क्षय" को कॉल कर सकते हैं क्योंकि std::decay
इन प्रकारों से करेगा, लेकिन मानक सिर्फ यह एक फ़ंक्शन-टू-पॉइंटर रूपांतरण [रूपांतरण।समारोह]:
समारोह प्रकार T
का एक lvalue प्रकार का एक prvalue में बदला जा सकता परिणाम कार्य करने के लिए एक सूचक है "T
सूचक।"।
यदि आप पूछ रहे हैं कि फ़ंक्शन-टू-पॉइंटर रूपांतरण कब होता है, तो वे मूल रूप से वही होते हैं जब अन्य दो लालू परिवर्तन होते हैं।
एक संकार्य के रूप में एक समारोह का उपयोग करना, [expr]/9:
हम सिर्फ क्रम में मानक के माध्यम से जाना है, तो निम्न मामलों की एक विस्तृत सूची जहां समारोह करने के लिए सूचक रूपांतरण होता है जब भी एक ग्लैवल्यू अभिव्यक्ति ऑपरेटर के एक ऑपरेंड के रूप में दिखाई देती है जो उस ऑपरेंड के लिए एक अनुमान की अपेक्षा करता है, लेल्यू-टू-रावल्यू (4.1), सरणी-टू-पॉइंटर (4.2), या फ़ंक्शन-टू-पॉइंटर (4.3) मानक रूपांतरण अभिव्यक्ति को एक प्रसार में बदलने के लिए लागू किया गया है।
एक varargs कार्य करने के लिए एक तर्क के रूप में एक समारोह का उपयोग करना, [expr.call]/7:
जब किसी दिए गए तर्क के लिए कोई पैरामीटर नहीं है, तर्क इस तरह से पारित कर दिया है कि प्राप्त करने वाला फ़ंक्शन va_arg
(18.10) का आह्वान करके तर्क का मान प्राप्त कर सकता है ... lvalue-to-rvalue (4.1), सरणी-से-पॉइंटर (4.2), और फ़ंक्शन-टू-पॉइंटर (4.3) मानक रूपांतरण हैं तर्क अभिव्यक्ति पर प्रदर्शन किया।
आप कर सकते हैं static_cast
दूर इस रूपांतरण, [expr.static.cast]/7:
किसी भी मानक रूपांतरण अनुक्रम (खंड 4) एक lvalue करने वाली rvalue युक्त नहीं की प्रतिलोम (4.1), सरणी- सूचक (4.2), फ़ंक्शन-टू-पॉइंटर (4.3), शून्य सूचक (4.10), शून्य सदस्य सूचक (4.11), या बूलियन (4.12) रूपांतरण, स्पष्ट रूप से static_cast
का उपयोग करके किया जा सकता है।
अन्यथा हालांकि, संकार्य आप में पारित परिवर्तित हो जाएगा, [expr.static.cast]/8:
lvalue करने वाली rvalue (4.1), सरणी-टू-सूचक (4.2), और फ़ंक्शन-टू-पॉइंटर (4.3) रूपांतरण ऑपरेटरों को पर लागू होते हैं।
reinterpret_cast
का उपयोग करना, [expr.reinterpret.cast]/1:
अभिव्यक्ति reinterpret_cast<T>(v)
का परिणाम अभिव्यक्ति v
परिवर्तित टाइप करने के लिए T
का परिणाम है। यदि T
एक लवल्यू संदर्भ प्रकार या फ़ंक्शन प्रकार के लिए एक रावल्यू संदर्भ है, तो परिणाम एक अंतराल है; यदि T
ऑब्जेक्ट प्रकार के रैवल्यू संदर्भ है, तो परिणाम एक xvalue है; अन्यथा, परिणाम एक प्रावधान है और lvalue-torvalue (4.1), सरणी-से-पॉइंटर (4.2), और फ़ंक्शन-टू-पॉइंटर (4.3) मानक रूपांतरण अभिव्यक्ति v
पर किए जाते हैं।
[expr.const.cast] const_cast
का उपयोग करना,, ऊपर करने के लिए मूल रूप से समान शब्दों के साथ। सशर्त ऑपरेटर [expr.cond] का उपयोग करना,:
lvalue करने वाली rvalue (4.1), सरणी-टू-सूचक (4.2), और समारोह करने के लिए सूचक (4.3) मानक रूपांतरण पर प्रदर्शन कर रहे हैं दूसरा और तीसरा ऑपरेंड।
उपरोक्त स्थितियों में से सभी में
सूचना, यह हमेशा lvalue परिवर्तनों के सभी है।
टेम्पलेट्स में फ़ंक्शन-टू-पॉइंटर रूपांतरण भी होते हैं। एक गैर प्रकार पैरामीटर के रूप में एक समारोह पासिंग, [temp.arg.nontype] /5.4:
एक गैर प्रकार के लिए टेम्पलेट पैरामीटर प्रकार सूचक की कार्य करने के लिए, समारोह करने के लिए सूचक रूपांतरण (4.3) [temp.deduct.call]
या प्रकार कटौती लागू किया जाता है,/2:
:
तो P
एक संदर्भ प्रकार नहीं है
- - यदि
A
एक सरणी प्रकार है, तो सरणी-से-पॉइंटर मानक रूपांतरण (4.2) द्वारा उत्पादित सूचक प्रकार A
के स्थान पर कटौती के लिए उपयोग किया जाता है; अन्यथा,
- - यदि
A
फ़ंक्शन प्रकार है, तो फ़ंक्शन-टू-पॉइंटर मानक रूपांतरण (4.3) द्वारा उत्पादित पॉइंटर प्रकार का उपयोग A
के स्थान पर कटौती के लिए किया जाता है; अन्यथा,
या कनवर्ज़न फ़ंक्शन टेम्पलेट कटौती, लगभग वही शब्द के साथ।
और अंत में, जाहिर है, std::decay
ही है, [meta.trans.other], में जोर मेरा परिभाषित:
U
remove_reference_t<T>
बनें। यदि is_array<U>::value
सत्य है, तो सदस्य टाइपपीफ़ प्रकार remove_extent_t<U>*
के बराबर होगा। यदि is_function<U>::value
सत्य है, तो सदस्य टाइपपीफ़ प्रकार add_pointer_t<U>
के बराबर होगा। अन्यथा सदस्य टाइपपीफ प्रकार remove_cv_t<U>
के बराबर है। [नोट: यह व्यवहार lvalue-to-rvalue (4.1), सरणी-से-पॉइंटर (4.2), और फ़ंक्शन-टू-पॉइंटर (4.3) रूपांतरणों के समान होता है जब एक लालू अभिव्यक्ति को रावल्यू के रूप में उपयोग किया जाता है, लेकिन सीवी-वर्ग प्रकारों से क्वालीफायर भी बहस के आधार पर अधिक बारीकी से मॉडल के लिए स्ट्रिप्स। -एंड नोट]
पहला बिट गलत है –
@Ed देखभाल की व्याख्या करने के लिए? – user4179986
इस प्रश्न का उद्देश्य क्या है –