2014-10-17 7 views
5

मैं निम्नलिखित कोड भर में आया था:"char (& (...)) [2]" का अर्थ क्या है?

char (&f(...))[2];

मैं इसके बारे में प्रकार की जाँच की (typeid और C++ filt प्रयोग करके) और मिल गया:

char (&(...)) [2]

लेकिन मैं नहीं कर सकता इस प्रकार की भावना बनाओ। [2] वह हिस्सा है जो मुझे फेंकता है। इसके बिना, मैं एक समारोह परिभाषा प्रकार की नकल कर सकते हैं, उदाहरण के लिए:

:

char (&f(...))

च में (typeid + C++ filt के उत्पादन में से कम से कम) एच के रूप में एक ही प्रकार के है

char& h(...)

+0

कृपया पूरा संदर्भ पोस्ट करें जिसमें यह कोड दिखाई देता है। –

+0

क्या यह चार फ़ंक्शन लौटने और सी-स्टाइल एलिप्स लेने की सरणी के संदर्भ में नहीं है? – Creris

+3

यह एक फ़ंक्शन है जो दो वर्णों की सरणी के संदर्भ को वापस कर रहा है। दूसरा एक ('char (& f (...))') एक फ़ंक्शन है जो किसी वर्ण के संदर्भ को वापस कर रहा है। बाहरी संश्लेषण दूसरे मामले में अनिवार्य हैं और दोनों मामलों में '...' एक सी परिवर्तनीय तर्क पैक है। – 0x499602D2

उत्तर

3

यह एक समारोह घोषणा पैरामीटर की संख्या अलग है कि है और दो तत्वों का एक चरित्र सरणी के लिए एक संदर्भ देता है।

इसे टाइपिफ़ का उपयोग करके सरल घोषित किया जा सकता है। उदाहरण

typedef char char_array[2]; 

char_array & f(...); 
2

के लिए आप cdecl का उपयोग करें और अंडाकार के लिए कोई भी प्रकार स्थानापन्न, इस तरह के int के रूप में कर सकते हैं:

char (&f(int)) [2] 

बिक्रीसूत्र

को

घोषित f समारोह (int) लौटने संदर्भ के रूप में char के सरणी 2 [...]

वापस विकल्प और आपके पास शब्दों में घोषणा है।

2
char (&f(...))[2]; 

यह दो वर्णों की एक सरणी के संदर्भ को वापस करने वाले फ़ंक्शन की घोषणा है। इसके लिए वाक्य रचनात्मक रूप से सही होने के लिए कोष्ठक की आवश्यकता होती है। अन्यथा &char से जुड़ जाएगा और [2] की अर्थहीन होने के कारण एक वाक्यविन्यास त्रुटि होगी।

वाक्यविन्यास को एक प्रकार के उपनाम के साथ विघटित किया जा सकता है। उदाहरण के लिए:

using array_ref = char (&)[2]; 
array_ref f(...); 

एक वास्तविक सरणी एक सरणी के बजाय के लिए एक संदर्भ लौटने के लिए कारण है, क्योंकि तथ्य यह है कि सरणियों कार्यों से वापस नहीं किया जा सकता है की है। यह नामुमकिन है। आप केवल कार्यों की तरह, सरणी या पॉइंटर्स को सरणी में वापस कर सकते हैं।

सभी उदाहरणों में, ... एक सी variadic argument pack है।


केवल स्थानों पर जहां मैं वाक्य रचना के इस प्रकार देखा है जहां यह SFINAE के लिए समारोह अधिभार संकल्प के हिस्से के रूप में इस्तेमाल किया जा रहा है है। आम तौर पर यह फ़ंक्शन उसी नाम के अधिभार के साथ होता है जो किसी दिए गए प्रकार की विशेषता को देखने के लिए टेम्पलेट प्रतिस्थापन का उपयोग करता है।यदि प्रतिस्थापन विफलता दूसरी अधिभार (जो एक वैरैडिक पैक लेता है) को फॉलबैक के रूप में चुना जाता है। इसका रिटर्न प्रकार सफलता या विफलता को अलग करता है।

उदाहरण के लिए, यहाँ विशेषता वर्ग की जाँच करता है कि एक प्रकार एक सदस्य समारोह f() है अगर है:

template <typename T> 
struct has_f 
{ 
private: 
    using true_type = char (&)[1]; 
    using false_type = char (&)[2]; 

    template <typename U> 
    static decltype(std::declval<U>().f(), true_type()) f(int); 

    template <typename> 
    static false_type f(...); 
public: 
    static constexpr bool value = sizeof(check<T>(0)) == 1; 
}; 

आप देख सकते हैं, अगर T एक सदस्य समारोह f() है, तो प्रकार लौटाया के आकार हो जाएगा 1, अन्यथा 2true_type और false_type इन दिनों मानक गुण कक्षा std::true_type और std::false_type द्वारा बड़े पैमाने पर अधिलेखित किए जाते हैं, लेकिन यह इसका उपयोग उदाहरण के लिए एक उदाहरण है।

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