2011-10-22 11 views
11

ऐसे कोड है:बदलने वापसी मान

#include <iostream> 
#include <string> 

int returnnumber() { return 2; } 
std::string returntext() { return "siema"; } 

int main() { 

    std::cout << (returntext() += "cze") << std::endl; // siemacze 
    //std::cout << (returnnumber() += 2) << std::endl; error: lvalue required as left operand of assignment 

    return 0; 
} 

क्यों std :: स्ट्रिंग की वापसी मान बदलने के लिए है, लेकिन int नहीं हो सकता है?

उत्तर

10

क्योंकि std::string एक सदस्य प्रकार के रूप में परिभाषित += ऑपरेटर के साथ एक वर्ग प्रकार है।

और मानक आपको रैल्यू पर सदस्य कार्यों को कॉल करने की अनुमति देता है।

 
Comeau C/C++ 4.3.10.1 (Oct 6 2008 11:28:09) for ONLINE_EVALUATION_BETA2 
Copyright 1988-2008 Comeau Computing. All rights reserved. 
MODE:strict errors C++ C++0x_extensions 

"ComeauTest.c", line 7: error: expression must be a modifiable lvalue 
     foo().x = 666; // !Nah, can't assign to rvalue of built-in type. 
    ^

1 error detected in the compilation of "ComeauTest.c". 

हालांकि, compilers अलग (या अलग करने के लिए प्रयोग किया जाता) कैसे सख्ती से वे इस सूक्ष्म नियम लागू के बारे में, या:

इस बात का एक मूर्खतापूर्ण परिणाम यह है कि

struct S { int x; }; 
S foo() { return S(); } 

int main() 
{ 
    foo() = S(); // OK, uses member assignment operator. 
    foo().x = 666; // !Nah, can't assign to rvalue of built-in type. 
} 

संकलन परिणाम है अगर सब पर।

चियर्स & hth।,

+0

ठीक है, लेकिन 'int' ऑपरेटर '+ 'के लिए भी परिभाषित किया गया है। – Vlad

+0

@downvoter: क्यों? – Vlad

+0

@ अनामित डाउनवॉटर: कृपया अपने डाउनवोट को समझाएं ताकि अन्य आपकी अंतर्दृष्टि से लाभ उठा सकें, या कुछ बेवकूफ कारणों को अनदेखा कर सकें। –

2

निर्मित एक प्रकार का एक परिवर्तनीय lvalue लेकिन एक समारोह की वापसी मान होना चाहिए है हमेशा एक rvalue अगर समारोह के लिए एक असाइनमेंट ऑपरेटर के बाएं हाथ की ओर एक संदर्भ प्रकार वापस नहीं करता है।

operator+=std::string के एक सदस्य समारोह है और आप वर्ग प्रकार का एक rvalue पर एक सदस्य समारोह कॉल कर सकते हैं।

+0

मुझे आश्चर्य है, क्यों इस तरह की असंगतता? – Vlad

+0

क्या आपका मतलब "असाइनमेंट ऑपरेटर के बाएं हाथ की ओर है?" –

+0

@VaughnCato: हाँ, मैंने किया। धन्यवाद। –

1
इसी कारण

std::string("siema") += "cze"; 

काम करता है के लिए

आप एक नई वस्तु का निर्माण कर रहे हैं और operator += (जो std::string है) को लागू कर रहे हैं।

इसके साथ प्रयास करने से यह काम नहीं करेगा क्योंकि आपका फ़ंक्शन rvalue देता है।

2 += 2 

इस के साथ आप के आसपास खिलौना कर सकते हैं:

#include <iostream> 
#include <string> 

int& returnnumber() { int * k = new int; *k = 2; return *k; } 
std::string returntext() { return "siema"; } 

int main() { 

    std::cout << (returntext() += "cze") << std::endl; // siemacze 
    std::cout << (returnnumber() += 2) << std::endl; //no error 
    std::string("siema") += "cze"; 
    return 0; 
} 

लेकिन यह एक स्मृति रिसाव को बढ़ावा मिलेगा, तो यह मत करो यह जैसा होगा। यह केवल अवधारणा का सबूत है कि lvalue लौटने पर काम करेगा।

+0

हाय लुचियन :) क्या 'रिटर्नटेक्स्ट' एक रावल्यू भी वापस नहीं करता है? – Vlad

+0

चार्ल्स बेली ने लिखा है: लेकिन फ़ंक्शन का रिटर्न वैल्यू हमेशा एक रावल्यू होता है यदि फ़ंक्शन संदर्भ प्रकार नहीं देता है। फिर returntext रैवल्यू या lvalue देता है? – scdmb

+0

मैं उलझन में हूं, कुछ पढ़ने के लिए बंद :) –

0

returntext() एक std::string जो बाद के चरणों में संशोधित किया जा सकता +=operator के साथ कह देता है। हालांकि, returnnumber()int लौटाता है, यह फ़ंक्शन स्वयं 2 लौटा रहा है जो const int को डिफॉल्ट करता है और यह परिवर्तनीय नहीं है और यही कारण है कि संकलक शिकायत करता है।

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