2010-06-22 12 views
42

मैं FCD (§7.6.1.2/4) के पेज 148 पर उदाहरण की अंतिम पंक्ति समझ में नहीं आता:decltype और कोष्ठकों

const int&& foo(); 
int i; 
struct A { double x; }; 
const A* a = new A(); 
decltype(foo()) x1 = i;  // type is const int&& 
decltype(i) x2;    // type is int 
decltype(a->x) x3;   // type is double 
decltype((a->x)) x4 = x3; // type is const double& 

क्यों कोष्ठकों यहाँ एक फर्क कर सकता हूँ? क्या यह ऊपर की रेखा में double नहीं होना चाहिए?

उत्तर

35

बस कि उपरोक्त उदाहरण है, यह कहना है

  • अगर ई एक unparenthesized आईडी अभिव्यक्ति या एक वर्ग के सदस्य एक्सेस (5.2.5), decltype (ई) है द्वारा वर्णित निकाय के प्रकार है ई।
  • यदि ई एक लाभा है, decltype (ई) टी & है, जहां टी ई प्रकार का है;

मुझे लगता है कि decltype(a->x) "वर्ग के सदस्य पहुँच" का एक उदाहरण है और decltype((a->x)) lvalue का एक उदाहरण है।

+0

लेकिन यह कॉन्स्ट्रेंस की व्याख्या नहीं करता है :) – fredoverflow

+5

@FredOverflow: यह भी है: 'a' प्रकार 'const * * – Cubbi

+1

मैंने कॉन्स्ट को कैसे नहीं देखा ??? धन्यवाद :) – fredoverflow

8

जोड़े गए माता-पिता इसे एक अंतराल में बदल रहे हैं।

MSDN says
आंतरिक कोष्ठक सदस्य के उपयोग के बजाय बयान का मूल्यांकन अभिव्यक्ति के रूप में मूल्यांकन करते हैं। और क्योंकि एक कोस्ट पॉइंटर के रूप में घोषित किया जाता है, तो प्रकार डबल का संदर्भ है।

16
decltype(a->x) 

यह आपको सदस्य चर A::x, जो double है के प्रकार देता है।

decltype((a->x)) 

यह आपको अभिव्यक्ति (a->x) है, जो एक lvalue अभिव्यक्ति है के प्रकार देता है (इसलिए कारण है कि यह एक स्थिरांक है reference-- a एक const A* है)।

+4

ठीक है, मैं समझता हूं कि नियमों को यहां कैसे लागू किया जा सकता है, लेकिन * ऐसे नियम क्यों हैं? 'A-> x' और' (a-> x) 'के बीच अंतर करने का अर्थ क्यों है? यह मेरे लिए इतना यादृच्छिक प्रतीत होता है। मैं कभी उस व्यवहार को क्यों चाहूंगा? कोई विचार? – fredoverflow

+0

धन्यवाद, लेकिन मेरे सिस्टम पर 'decltype (f()) 'और' decltype ((f()) दोनों' उपज 'int'। क्या मैंने आपको गलत समझा? – fredoverflow

+0

@Fred: कभी नहीं। मैं गलत था। उस विशेष मामले में, कोष्ठक को अनदेखा कर दिया जाता है, इसलिए दोनों को 'const int' होना चाहिए। –

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