2011-03-01 19 views
8

जब int i = 5;क्या रैवल हमेशा स्थिर होते हैं?

int j = i; 

rvalue करेंगे i इस अभिव्यक्ति में जब परिणाम का मूल्यांकन एक निरंतर हो सकता है?

मैं इस सवाल पूछ रहा हूँ क्योंकि मेरे प्रति निर्माता में अपने तर्क एक const

+3

"एक' const' आवश्यक है ":

int f(); int& g(); const int& h(); const int k(); int main() { f(); // non-const rvalue expression g(); // non-const lvalue expression h(); // const lvalue expression k(); // const rvalue expression f() = 5; // error, cannot assign to an rvalue g() = 5; // correct, can modify a non-const lvalue h() = 5; // error, cannot modify a constant lvalue } 

अन्य उदाहरण उपयोगकर्ता परिभाषित प्रकार के उपयोग की आवश्यकता है कि यह एक' स्थिरांक एक और 'स्वीकार करता है, तो आप भी इसे पारित कर सकते हैं कुछ' एक और ', चूंकि गैर-कॉन्स से कास्ट तक कास्ट निश्चित रूप से होता है। –

+0

आपको "अपनी प्रतिलिपि कन्स्ट्रक्टर" का कोड जोड़ना चाहिए और समझाएं कि "क्या' const 'की आवश्यकता है "। इससे संभावित रूप से भ्रमित प्रश्न के उत्तर के बजाय, आपके वास्तविक संदेह का उत्तर प्राप्त करने में मदद मिलेगी। –

उत्तर

14

lvalue/rvalue शर्तों के आसपास एक आम गलतफहमी है। वे चर के संदर्भ में नहीं बल्कि अभिव्यक्तियों का उल्लेख करते हैं। एक अभिव्यक्ति या तो एक लाभा या एक रावल उत्पन्न कर सकती है, और यह या तो कॉन्स या गैर-कॉन्स हो सकती है।

विशेष रूप से, आपके कोड में i परिभाषा int j = i; की दाईं ओर अभिव्यक्ति i एक लालसा अभिव्यक्ति है, एक रैल्यू नहीं है। असाइनमेंट के उद्देश्य के लिए रावल्यू रूपांतरण के लिए एक लवण है और फिर इसे नए घोषित चर के लिए असाइन किया गया है।

कंट-नेस एक ऑर्थोगोनल अवधारणा है - ज्यादातर मामलों में - और इससे संबंधित है कि आप उस ऑब्जेक्ट को म्यूटेट कर सकते हैं या नहीं कर सकते हैं।

struct test { 
    void foo() { x = 5; } 
    void bar() const; 
    int x; 
}; 
test f(); 
const test g(); 
int main() { 
    f().foo();  // f() is a non-const rvalue, 
        // but you can call a method on the resulting object 
    g().foo();  // g() is a const rvalue, 
        // you cannot call a mutating member function 
    g().bar();  // but you can call a const member function 
} 
+0

हाय, मैं पहले उदाहरण को संकलित क्यों नहीं कर सकता? धन्यवाद। मैंने त्रुटि बयान पर टिप्पणी करने की कोशिश की लेकिन अभी भी संकलित नहीं है। – user12321

+0

@ user12321: आप शायद संकलित कर सकते हैं लेकिन लिंक * नहीं * क्योंकि फ़ंक्शन परिभाषित नहीं किए गए हैं (क्या त्रुटि * अनिर्धारित प्रतीक ... *?) है। एक फ़ंक्शन बॉडी जोड़ें जैसे '{static int x = 10; वापसी एक्स; } 'कार्यों में से प्रत्येक के लिए, उन पंक्तियों पर टिप्पणी करें जो त्रुटि के रूप में चिह्नित हैं और पुनः प्रयास करें। ('स्थिर 'केवल यह सुनिश्चित करने के लिए है कि वेरिएबल संदर्भों को वापस करने वाले संस्करणों से लौटने के बाद भी जीवित है) –

3

सी ++ में की आवश्यकता है, की rvalues ​​में निर्मित प्रकार स्थिरांक या गैर स्थिरांक नहीं हो सकता। यह सिर्फ समझ में नहीं आता है। हालांकि, वर्ग प्रकारों के आधार और गैर-आधार वाले राक्षस हो सकते हैं।

एक रैल्यू केवल VALUE (वस्तु/चर नहीं) है। आप "निरंतर मूल्य" के साथ क्या समझेंगे?

+1

@Downvoter: मुझे आश्चर्य है कि मेरे जवाब में क्या गलत था? –

+0

@ आर्मेन: मैं @downvoter नहीं हूं, लेकिन ... आपने कहा "सी ++ में, अंतर्निर्मित प्रकार के राक्षसों का आधार या गैर-आधार नहीं हो सकता है।" एक रैल्यू ** ** या तो कॉन्स या गैर-कॉन्स होना चाहिए। ओपीएस उदाहरण में, मैं रावल्यू हूं और ** गैर-कॉन्स ** है। अगर मुझे 'कॉन्स्ट int i = 5' घोषित किया गया था, तो जब एक रावल्यू के रूप में उपयोग किया जाता है, तो रावल ** कॉन्स ** है। – qbert220

+2

@ क्यूबर्ट: गलत :) सी ++ मानक 3.10.9 राज्य कक्षा के रावजू में सीवी-योग्य प्रकार हो सकते हैं; गैर-वर्ग के राजस्व में हमेशा सीवी-अयोग्य प्रकार होते हैं। रावलों में हमेशा पूर्ण प्रकार या शून्य प्रकार होगा; इन प्रकारों के अतिरिक्त, lvalues ​​में अपूर्ण प्रकार भी हो सकते हैं। –

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

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