ए () = ए () - यह क्यों संकलन करता है?


85
class A {};

int main() {
 A() = A();
 return 0; 
}

यह कोड क्यों संकलित करता है? क्या कुछ त्रुटि नहीं होनी चाहिए कि असाइनमेंट ऑपरेटर के बाईं ओर लैवल्यू रखा जाना चाहिए? क्या A () लैवल्यू है? g ++ 4.7 संस्करण

जवाबों:


88

अंतर्निहित प्रकारों के लिए, आप सही होंगे: अंतर्निहित असाइनमेंट ऑपरेटर को बाएं हाथ की ओर एक संशोधित अंतराल की आवश्यकता होती है ।

हालांकि, यह बिल्ट-इन ऑपरेटर का उपयोग नहीं कर रहा है, लेकिन अधिभार जो कि वर्ग द्वारा स्पष्ट रूप से घोषित किया गया है। यह एक सदस्य कार्य है, जिसके समतुल्य है

A().operator=(A());

और सदस्य कार्यों को प्रतिद्वंद्वियों पर बुलाया जा सकता है ।


7
यह आरंभीकरण की नकल नहीं है?
स्टारडस्ट

13
@ नाम: नहीं, यह असाइनमेंट है आरंभीकरण नहीं।
माइक सेमोर

1
@ paul23: यह सच है (यह मानते हुए कि आपका मतलब operator=नहीं है operator()), लेकिन सवाल के साथ बहुत कुछ करना नहीं है। उदाहरण असाइनमेंट के परिणाम के साथ कुछ भी नहीं करता है।
माइक सेमोर

3
@ paul23 A()कॉल नहीं करता है operator(), यह एक प्रकार की वस्तु का निर्माण करता है A
अंतरजाल

3
यह कोई घोषणा नहीं हो सकती क्योंकि कोई घोषणा नहीं है।
कोस

32

यदि आप वास्तव में चाहते हैं, तो आप इसे C ++ 11 के साथ संकलित नहीं कर सकते हैं:

class A {
    template <typename T>
    void operator=(T&&) && = delete; // no op= for rvalues

    // generate other special members normally
    A() = default;
    A(A const&) = default;
    A(A&&) = default;
    ~A() = default;
    // op= only for lvalues
    A& operator=(A&&) & = default;
    A& operator=(A const&) & = default;
};

int main() {
 A() = A(); // error
 return 0; 
}

( लाइव उदाहरण )

विभिन्न रूपों की घोषणाओं के अंत में नोट ( &और &&उर्फ रेफरी-क्वालिफायर) operator=। यह उन घोषणाओं को क्रमशः अंतराल और अंतराल के लिए चुना जाता है। हालाँकि, जब ओवरलोड रिज़ॉल्यूशन द्वारा चुना जाता है, तो rvalue संस्करण प्रोग्राम को बीमार बनाने का कारण बनता है क्योंकि इसे हटा दिया जाता है।

डिफ़ॉल्ट उत्पन्न ऑपरेटर =, हालांकि, कोई भी रेफरी-क्वालीफायर नहीं है, जिसका अर्थ है कि इसे अंतराल और अंतराल दोनों के लिए कहा जा सकता है; यही कारण है कि प्रश्न में कोड का संकलन है, भले ही A()एक प्रतिद्वंद्विता हो।


1

C ++ कंपाइलर एक डिफ़ॉल्ट कंस्ट्रक्टर के साथ सभी वर्गों को प्रदान करता है, यही आपके कोड के संबंध में होता है, जब आप A () = A () कहते हैं; यह बस एक बेकार वस्तु के साथ निर्माता को आमंत्रित करता है और फ़ंक्शन निर्मित वस्तु (निहित) के संदर्भ देता है। बस...

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.