में rvalues करने के लिए गैर स्थिरांक संदर्भ पासिंग कोड की निम्न पंक्ति में:सी ++
bootrec_reset(File(path, size, off), blksize);
प्रोटोटाइप के साथ एक समारोह कॉलिंग:
:libcpfs/mkfs.cc:99:53: error: invalid initialization of non-const reference of type 'File&' from an rvalue of type 'File'
libcpfs/mkfs.cc:30:13: error: in passing argument 1 of 'void bootrec_reset(File&, ssize_t)'
static void bootrec_reset(File &file, ssize_t blksize);
मैं यह त्रुटि प्राप्त
मुझे पता है कि आप गैर-कॉन्स संदर्भ (const &
) को मानक के अनुसार रैल्यू में पारित नहीं कर सकते हैं। एमएसवीसी हालांकि आपको ऐसा करने की अनुमति देता है (this question देखें)। This question व्याख्या करने का प्रयास क्यों करता है लेकिन उत्तर को कोई अर्थ नहीं है क्योंकि वह शाब्दिक संदर्भों का उपयोग कर रहा है, जो एक कोने का मामला है और स्पष्ट रूप से अस्वीकृत होना चाहिए।
दिए गए उदाहरण यह देखने के लिए कि घटनाओं के निम्नलिखित क्रम हो जाएगा (के रूप में यह MSVC में करता है) स्पष्ट है में:
File
के निर्माता बुलाया जाएगा।File
, औरblksize
का संदर्भ, ढेर पर धकेल दिया जाता है।bootrec_reset
file
का उपयोग करता है।bootrec_reset
से लौटने के बाद, अस्थायीFile
नष्ट हो गया है।
यह करते रहे कि File
संदर्भ गैर स्थिरांक होने की जरूरत है आवश्यक है, क्योंकि यह एक फ़ाइल है, जो गैर-स्थिरांक तरीकों लागू कर रहे हैं के लिए एक अस्थायी संभाल है। इसके अलावा मैं के कन्स्ट्रक्टर तर्कों को bootrec_reset
पर वहां से बनाने के लिए पास नहीं करना चाहता हूं, न ही मुझे कॉलर में File
ऑब्जेक्ट मैन्युअल रूप से बनाने और नष्ट करने का कोई कारण दिखाई देता है।
तो मेरी प्रश्न हैं:
- सी ++ मानक इस तरह से गैर स्थिरांक संदर्भ अनुमति न देने क्या सही ठहराते हैं?
- मैं इस कोड को अनुमति देने के लिए जीसीसी को कैसे मजबूर कर सकता हूं?
- क्या आगामी सी ++ 0x मानक इसे किसी भी रूप में बदलता है, या क्या नया मानक मुझे कुछ देता है जो यहां अधिक उचित है, उदाहरण के लिए सभी रावल संदर्भों के बारे में चिंतित हैं?
मुझे पता नहीं था कि संदर्भों के लिए बाध्यकारी होने पर अंतराल को अस्थायी रूपांतरित कर दिया गया था। यदि ऐसा है तो निर्णय समझ में आता है। * संपादित करें *: मैंने अभी इसका परीक्षण किया है और वे नहीं हैं? –
@ मैट: नियम C++ 0x के साथ बदल गए। वह नियम परिवर्तन उदा। तर्क के रूप में 'std :: auto_ptr' गुजर रहा है। वैसे भी, जब कॉन्स्ट के संदर्भ में बाध्यकारी हो, और वास्तविक तर्क आवश्यक प्रकार (या व्युत्पन्न वर्ग) का नहीं है, तो एक अस्थायी रूप से पेश किया जाना चाहिए। चीयर्स, –
@ मैट: आपने वास्तव में क्या परीक्षण किया? मेरा स्निपेट संकलित नहीं होना चाहिए क्योंकि सी ++ स्पष्ट रूप से एक अस्थायी (नवीनतम एमएसवीसी ++ और जी ++ इसे देखते हुए) को गैर-कॉन्स रेफरी बाध्यकारी रूप से अस्वीकार करता है; एक कॉन्स रेफरी को रेफरी बदलना निश्चित रूप से '++ x;' के कारण संकलन विफल हो जाएगा। –