2009-08-28 17 views
9

के लिए अस्थायी मैं निम्नलिखित कोडबाध्यकारी एक lvalue संदर्भ

string three() 
{ 
    return "three"; 
} 

void mutate(string& ref) 
{ 
} 

int main() 
{ 
    mutate(three()); 
    return 0; 
} 

है आप देख सकते हैं मैं तीन()करने मे बदलें विधि गुजर रहा हूँ। यह कोड अच्छी तरह से संकलित करता है। मेरी समझ यह है कि अस्थायी को गैर-कॉन्स संदर्भों को असाइन नहीं किया जा सकता है। यदि हां, यह प्रोग्राम कैसे संकलित कर रहा है?

कोई विचार?

संपादित करें:

संकलनकर्ता की कोशिश की: वी.एस. 2008 और VS2010 बीटा

+0

जीसीसी आज़माएं यह सी ++ मानक के करीब है। – Learner

+0

दुर्भाग्य से, मेरे पास जीसीसी नहीं है। –

+0

@Appu: गायब होने के लिए आपके कोड को ठीक करने के बाद और 'std' उपसर्ग, Comau (http://www.comeaucomputing.com/tryitout/) कहता है: 'गैर-कॉन्स के संदर्भ का प्रारंभिक मान एक लवल्यू होना चाहिए'। वीसी इसे स्वीकार करने का कारण यह है कि वीसी टूट गया है। (वे इसे "फीचर" कहते हैं, लेकिन असल में यह एक बग है।) – sbi

उत्तर

8

यह वीसी 6 कंपाइलर में संकलित करने के लिए प्रयुक्त होता था, इसलिए मुझे पिछड़ा संगतता बनाए रखने का अनुमान है वीएस -2008 इस गैर-मानक विस्तार का समर्थन कर रहा है। /Za (अक्षम भाषा एक्सटेंशन) ध्वज के साथ प्रयास करें, आपको तब एक त्रुटि मिलनी चाहिए।

+0

ग्रेट के लिए बाध्य हो सकता है! यह अब काम करता है। –

+0

'/ Za' विकल्प निर्दिष्ट करने से' windows.h' या अन्य विंडोज़ विशिष्ट शीर्षलेखों सहित समस्याएं हो सकती हैं। –

+5

चार के रूप में चेतावनी स्तर का उपयोग करना बेहतर विकल्प है जिसे मैंने – yesraaj

1

यह नहीं है संकलन, जी के साथ ++ 4 कम से कम:

foo.cpp: In function ‘int main()’: 
foo.cpp:16: error: invalid initialization of non-const reference of type ‘std::string&’ from a temporary of type ‘std::string’ 
foo.cpp:10: error: in passing argument 1 of ‘void mutate(std::string&)’ 

(लाइन नंबर दिए गए हैं 3 या 4 से बंद, क्योंकि मुझे # शामिल और 'उपयोग' लाइनों को जोड़ना पड़ा था।)

इसलिए, आपका कंपाइलर उतना सख्त नहीं प्रतीत होता है जितना होना चाहिए।

+0

संपादित पोस्ट और जोड़े गए कंपाइलर्स मैं उपयोग कर रहा हूं। –

0

मुझे लगता है कि यह संकलक पर निर्भर करता है। जी ++ 4.1.2 मुझे यह देता है।

In function 'int main()': 
Line 15: error: invalid initialization of non-const reference of type 'std::string&' from a temporary of type 'std::string' 
compilation terminated due to -Wfatal-errors. 

शायद क्योंकि आप कुछ भी नहीं कर रहे हैं तो कॉल को अनुकूलित किया गया है।

+0

मैंने mutate() विधि के अंदर रेफ पैरामीटर के साथ कुछ करने की कोशिश की और यह अभी भी –

+0

संकलित करता है मैंने अभी इसे वीसी ++ में आजमाया है और यह संकलित करता है और तब तक काम करता है जब तक कि आप प्रोजेक्ट गुणों में एक्सटेंशन अक्षम नहीं करते। जब आप इसे प्राप्त करते हैं: 1> main.cpp 1> डी: \ all \ projects \ laptop \ 2 \ asd \ asd \ main.cpp (16): त्रुटि C2664: 'mutate': पैरामीटर 1 को परिवर्तित नहीं कर सकता 'std :: string' से 'std :: string &' 1> एक गैर-कॉन्स्ट संदर्भ केवल एक lvalue –

3

यह कई अन्य माइक्रोसॉफ्ट कंपाइलर्स के व्यवहार की नकल करने के लिए एक माइक्रोसॉफ्ट एक्सटेंशन है। यदि आप W4 चेतावनियां सक्षम करते हैं, तो आपको चेतावनी दिखाई देगी।

4

यह वीसी ++ का बुरा विस्तार है। यदि आप/W4 के साथ oompile तो संकलक आपको चेतावनी देगा। मुझे लगता है कि आप Rvalue References: C++0x Features in VC10, Part 2 पढ़ रहे हैं। इस आलेख में भी इस मुद्दे का उल्लेख किया गया था।

+0

हां उपयोग किया था। मैं उस लेख को पढ़ रहा हूँ। –

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