2015-07-14 9 views
7

मैं सी ++ 11 की रैवल्यू फीचर सीख रहा हूं। सी ++ प्राइमर 5 वां संस्करण का कहना है कि एक रावल्यू संदर्भ केवल एक रावल्यू से जुड़ सकता है, लेकिन जब मैंने इस प्रोग्राम को संकलित करने का प्रयास किया, तो यह पास हो गया, और आउटपुट 1 1 है।g ++ 4.4.6 पर अनुमति देने वाले रेवल्यू संदर्भ बाध्यकारी के लिए लालसा क्यों है?

मुझे समझ में नहीं आता क्यों। मैं के साथ

जी ++ -Wall -std = C++ 0x test.cpp -ओ परीक्षण

#include <iostream> 

using namespace std; 

int main() 
{ 
    int i = 0; 
    int &&rr = i; 

    rr = 1; 
    std::cout << rr << std::endl; 
    std::cout << i << std::endl; 

    return 0; 
} 
+0

"रावल्यू संदर्भ लालसा से बंधे नहीं है" नियम सी ++ 11 मानकीकरण प्रक्रिया में काफी देर से जोड़ा गया था। संभवतः जीसीसी 4.4.6 विनिर्देश के पहले मसौदे को कार्यान्वित कर रहा है जिसमें उस प्रतिबंध नहीं है। –

+0

शायद आपके कंपाइलर को अपग्रेड करने का समय :) –

उत्तर

6

आपका कोड अमान्य है, एक ग्राम ++ 4.4.6 का उपयोग कर रहा है, और संकलित यह जैसा कि पुस्तक कहती है, वैसे ही लालू एक रावल्यू संदर्भ से बंधे नहीं जा सकते हैं। g++5.1 rejects your code त्रुटि संदेश

main.cpp:8:16: error: cannot bind 'int' lvalue to 'int&&' 
    int &&rr = i; 
       ^

जी ++ 4.4.6 के साथ अप्रैल 2011 में released था, एक महीने से भी कम समय के लिए सी ++ 11 अंतिम मसौदा के बाद approved था। जो व्यवहार आप देख रहे हैं वह या तो एक gcc बग है, या C++ 11 मानक के कुछ प्रारंभिक कार्य ड्राफ्ट द्वारा निर्दिष्ट व्यवहार है।

वर्तमान नियम N2844 में वर्णित है और gcc 4.5 में लागू किया गया है।

+0

रिकॉर्ड के लिए, वीएस2013 और वीएस2015 आरसी भी आपके कोड को अस्वीकार कर देता है। –

+1

आपको शायद 4.4.0 के रिलीज समय को देखना चाहिए, जो कि अप्रैल 200 9 में था। –

+0

[एन 2118] (http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2006/n2118 .html) में यह उदाहरण शामिल है: 'डबल && rd4 = i; // ठीक है, संदर्भ अस्थायी डबल ' – o11c

6

जीसीसी 4.4 श्रृंखला पहले April 2009 में जारी किया गया था, और ट्रंक नवंबर 2008

नियम है कि lvalues ​​के लिए बाध्य मार्च 2009 में मानक में मतदान किया गया था rvalue संदर्भ रोकता में अच्छी तरह से है कि पहले closed to all but regression and documentation fixes था, पेपर N2844 के रूप में, दिसंबर 2008 में पहले पेपर N2812 में सुझाए जाने के बाद।

इस प्रकार, नया नियम संभवतः जीसीसी 4.4 के लिए लागू नहीं किया जा सका (यह वास्तव में जीसीसी 4.5 के लिए लागू किया गया था)।

+0

तो जब वे किसी दिए गए शाखा के साथ रिलीज करते हैं, तो वे डीआर लागू नहीं करते हैं? या यह है कि एन 2844 को डीआर नहीं माना जाता है क्योंकि उस समय कोई सी ++ 11 मानक नहीं था? – Praetorian

+0

@Praetorian जहां तक ​​मुझे पता है, नीति यह है कि केवल प्रतिगमन और दस्तावेज़ीकरण फिक्स किए जाते हैं। –

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