2016-05-11 14 views
7

सी ++ प्राइमर के अनुसार, सी ++ तीर ऑपरेटर एक लाभा उत्पन्न करता है। इसके अतिरिक्त एक अभिव्यक्ति के decltype जो एक लाभा उत्पन्न करता है परिणामस्वरूप एक संदर्भ प्रकार होगा। तो क्यों निम्नलिखित अस्वीकरण परिणाम संदर्भ प्रकार में नहीं है।सी ++ तीर प्रकार उपज lvalue

struct MyStruct { 
    string name 
}; 
MyStruct s; 
s.name = "aname"; 
MyStruct* p = &s; 
decltype (p -> name) str = s.name; //type of str will be string and not &string although p -> name yields an lvalue 
+3

http://en.cppreference.com/w/cpp/language/decltype देखें। – Holt

उत्तर

5
decltype से

(जो § 7.1.6.2/4 से है [dcl.type.simple]):

तर्क एक unparenthesized आईडी अभिव्यक्ति या एक unparenthesized वर्ग के सदस्य पहुँच है, तो decltype इस पूर्व से वर्णित निकाय के प्रकार पैदावार अभिव्यक्ति।

p->name उपरोक्त मामले में गिर जाता है, तो decltype(p->name) के प्रकार p->name के प्रकार जो है std::string नहीं std::string& है।

दूसरी ओर, decltype((p->name))std::string& है क्योंकि (p->name) एक लवली अभिव्यक्ति है।

9

cppreference

तो तर्क एक unparenthesized आईडी अभिव्यक्ति या एक unparenthesized वर्ग के सदस्य पहुंच है, फिर decltype इस अभिव्यक्ति से वर्णित निकाय के प्रकार अर्जित करता है। यदि ऐसी कोई इकाई नहीं है, या यदि तर्क ओवरलोडेड फ़ंक्शंस का सेट सेट करता है, तो प्रोग्राम खराब बना हुआ है।

यह आपके उदाहरण में है, इसलिए यह सदस्य के अंतर्निहित प्रकार को वापस कर देगा, जो std::string है।

आप चाहते हैं, तो आप कोष्ठक में जोड़ सकते हैं ताकि decltype परिणाम एक संदर्भ में:

//'str' is a std::string& 
decltype((p->name)) str = s.name; 
संबंधित मुद्दे