2015-10-27 24 views
6

[12.8] [11] N3337 की ओर से:डिफ़ॉल्ट चाल निर्माता और संदर्भ सदस्यों

परोक्ष परिभाषित एक गैर संघ दसवीं कक्षा के लिए कॉपी/कदम निर्माता अपने ठिकानों में से एक सदस्य वार कॉपी/चाल करता है और सदस्य हैं। [नोट: गैर स्थैतिक डेटा सदस्यों के ब्रेस-या-बराबर-प्रारंभकर्ताओं को अनदेखा कर दिया जाता है। 12.6.2 में भी उदाहरण देखें। -जेंड नोट] प्रारंभिकरण का क्रम उपयोगकर्ता परिभाषित कन्स्ट्रक्टर में बेस और सदस्यों के प्रारंभिकरण के क्रम जैसा ही है (12.6.2 देखें)। x या तो कन्स्ट्रक्टर का पैरामीटर हो या चालक के लिए, पैरामीटर का जिक्र करते हुए एक xvalue हो। प्रत्येक आधार या गैर स्थैतिक डेटा सदस्य को इसके प्रकार के लिए उपयुक्त तरीके से प्रतिलिपि/स्थानांतरित किया जाता है:

- यदि सदस्य एक सरणी है, तो प्रत्येक तत्व x के संबंधित उप-प्रोजेक्ट के साथ प्रत्यक्ष-प्रारंभ होता है;

- यदि किसी सदस्य एम में rvalue संदर्भ प्रकार टी & & है, तो यह static_cast<T&&>(x.m) के साथ प्रत्यक्ष-प्रारंभ किया गया है;

- अन्यथा, आधार या सदस्य सीधे आधार या एक्स के सदस्य के साथ प्रारंभिक प्रारंभ होता है।

यह वास्तव में एक स्पष्टीकरण का अधिक है, लेकिन मुझे उस खंड में lvalue संदर्भ सदस्यों का कोई उल्लेख नहीं दिखाई दे रहा है। चूंकि यह उनका उल्लेख नहीं करता है, डिफ़ॉल्ट रूप से ऐसा लगता है कि वे अंतर्निहित सदस्यवार चाल का हिस्सा हैं, फिर भी निम्नलिखित काम नहीं करेंगे;

int x = 5; 
int& y = x; 
int& z(std::move(y)); //error: invalid initialization of non-const reference of type 'int&' from an rvalue of type 'std::remove_reference<int&>::type {aka int}' 

तो यह मान लेना डिफ़ॉल्ट चाल निर्माता अलग है कि है कि एक सदस्य एक संदर्भ है और बस सिर्फ std::move करने के लिए कोई कॉल के साथ

int& z = y; 

करना होगा सुरक्षित है?

+0

एक लैवल्यू संदर्भ xvalue से बाध्य नहीं किया जा सकता है, इसलिए 'int & z (std :: move (y));' कानूनी नहीं है। 'int &z = y;' कानूनी है और 'int' ऑब्जेक्ट के लिए' z' तीसरा नाम बनाता है जिसे वर्तमान में 'x' और 'y' नाम दिया गया है। मुझे यकीन नहीं है कि आपका प्रश्न क्या है? –

+0

"प्रत्यक्ष-प्रारंभिक" का अर्थ है कि एक सदस्य 'एम' के लिए, इसे' टी एम (अन्य.एम) द्वारा शुरू किया गया है; ' –

+0

मुझे लगता है कि यह http: // stackoverflow से संबंधित है (और संभवतः हल किया गया है)।कॉम/प्रश्न/3334425 9/करता-आरवो-वर्क-ऑन-ऑब्जेक्ट-सदस्य – Sheljohn

उत्तर

6

यह वर्ग सदस्य पहुंच अभिव्यक्तियों के विनिर्देशन द्वारा संभाला जाता है। मुख्य भाग

x या तो कन्स्ट्रक्टर का पैरामीटर हो, या चालक के लिए, पैरामीटर का जिक्र करते हुए एक xvalue हो।

दूसरे शब्दों में, के लिए

struct X { int x, &y; }; 

एक डिफॉल्ट की चाल निर्माता करता

X::X(X&& other) : x(std::move(other).x), y(std::move(other).y) {} 

यहां महत्वपूर्ण बात यह है के बराबर है कि एक वर्ग के सदस्य पहुँच अभिव्यक्ति x.m, जहां का परिणाम m एक गैर स्थैतिक डेटा सदस्य का नाम है, यदि m संदर्भ प्रकार है, तो हमेशा एक lvalue है, लेकिन x एक अंडाकार है औरहैमें गैर-संदर्भ प्रकार है। (देखें [expr.ref]/4।) यह सुनिश्चित करता है कि lvalue संदर्भ सदस्यों को lvalues ​​के साथ शुरू किया जाएगा।

+1

'y (std :: move (अन्य) .y)' 'y (other.y) 'जैसा ही है, है ना? संदर्भ-टाइप 'y' के लिए –

+0

@ एमएम राइट। –

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