2016-04-01 11 views
5

परीक्षण इस निम्नलिखित के अनुसार:सी ++ यह सदस्य फ़ंक्शन पॉइंटर कैसे नहीं है?

std::cout << std::is_member_function_pointer<int (A::*)()>::value << std::endl; 

सही का आकलन:

std::cout << std::is_member_function_pointer<int A::*()>::value << std::endl; 

सदस्य समारोह सूचक है, लेकिन नियमित रूप से समारोह, इस जबकि नहीं है। मैंने gcc & msvc दोनों के साथ प्रयास किया। इन दो घोषणाओं के बीच क्या अंतर है? क्या ये परिणाम सही हैं? A::* के आसपास कोष्ठक क्यों महत्वपूर्ण हैं?

+0

ऑपरेटर प्राथमिकता। क्षमा करें मैंने पहली बार इस टिप्पणी को एक व्यंग्यात्मक प्रश्न के रूप में पोस्ट किया था। अभी तक कोई कॉफी नहीं :(उम्मीद है कि मदद करता है। ध्यान दें कि सी ++ व्याकरण केवल व्याकरण नियमों के परिणामस्वरूप प्राथमिकता * * को परिभाषित करता है। लेकिन कुल मिलाकर एक प्रभावी प्राथमिकता है। –

+0

प्राथमिकता के साथ भी, int A :: *() वास्तव में क्या मतलब है? –

+3

मुझे एक ऐसे फ़ंक्शन की तरह दिखता है जो सदस्य सूचक देता है। – user2357112

उत्तर

3

ऑपरेटर प्राथमिकता से अलग-अलग संश्लेषित प्रकार अभिव्यक्तियों के अंतर।

 
C:\my\forums\so\120> echo struct A{}; using T = int A::*(); T o; int x = o; >1.cpp 

C:\my\forums\so\120> g++ -c 1.cpp 
1.cpp:1:48: error: invalid conversion from 'int A::* (*)()' to 'int' [-fpermissive] 
struct A{}; using T = int A::*(); T o; int x = o; 
               ^

C:\my\forums\so\120> _ 

तो, हम देखते हैं कि प्रकार int A::*() के एक चर प्रकार int A::* (*)() है:

यहाँ एक तरह से एक अधिक विस्तृत, एक प्रकार का विवरणात्मक विनिर्देश प्राप्त करने के लिए है।

संपादित: मैं इस पोस्ट को हटा नहीं सकते, जबकि यह, रिकार्ड के लिए तो समाधान के रूप में चिह्नित किया गया है: उपरोक्त कोड o में एक चर नहीं है। इसके बजाय यह फ़ंक्शन घोषणा है। int A::*() सीधे एक फ़ंक्शन प्रकार है, यानी एक डेटा सदस्य पॉइंटर लौटने वाला फ़ंक्शन।

अब कॉफी और नरक के लिए शीर्षक;

+0

यह घोषणाकर्ता है, ऑपरेटर नहीं –

+0

@ एमएम मैंने ऑपरेटर की प्राथमिकता का उल्लेख किया क्योंकि इस तरह सी सी वाक्यविन्यास बनाया गया है, घोषणाओं की नकल की घोषणा के साथ। इसके बारे में भी सोचा नहीं। :) औपचारिक रूप से आप सही हैं लेकिन यह एक कम व्यावहारिक रूप से उपयोगी दृश्य है। –

5

int A::*() समारोह है, जो प्रकार int साथ A के सदस्य रिटर्न के प्रकार है, कोई तर्क लेता है। तो यह सदस्य फ़ंक्शन पॉइंटर नहीं है, यहां तक ​​कि फ़ंक्शन पॉइंटर भी नहीं है।

std::cout << std::is_member_function_pointer<int A::*()>::value << std::endl; // 0 
std::cout << std::is_pointer<int A::*()>::value << std::endl;     // 0 
std::cout << std::is_function<int A::*()>::value << std::endl << std::endl; // 1 

और कोष्ठकों पूर्वता बदलने के लिए, int (A::*)()A के सदस्य समारोह सूचक है, जो int वापस आती है और कोई तर्क लेता का प्रकार है।

+0

यह उत्तर सही लगता है (जैसा कि मेरे मूल उत्तर के विपरीत है जिसमें बकवास का थोड़ा सा शामिल है :()। –

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