এ () = এ () - কেন এটি সংকলন করে?


85
class A {};

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

এই কোডটি সংকলন করে কেন? অ্যাসাইনমেন্ট অপারেটরের বাম দিকে লভ্যালু স্থাপন করা উচিত যে কোনও ত্রুটি হওয়া উচিত নয়? ক () মূল্য আছে? g ++ 4.7 সংস্করণ

উত্তর:


88

অন্তর্নির্মিত ধরণের জন্য, আপনি সঠিক হতে চাই: বিল্ট-ইন অ্যাসাইনমেন্ট অপারেটরের বাম দিকে একটি সংশোধনযোগ্য লভ্যালু প্রয়োজন ।

যাইহোক, এটি অন্তর্নির্মিত অপারেটরটি ব্যবহার করে না, বরং ওভারলোড যা ক্লাস দ্বারা স্পষ্টভাবে ঘোষণা করা হয়েছে। এটি একটি সদস্য ফাংশন, সমতুল্য

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

এবং সদস্য ফাংশনগুলি মূল্যের উপর কল করা যেতে পারে ।


7
এটি কি কপিরাইট ইনিশিয়ালেশন নয়?
স্টারডাস্ট

13
@ নাম: না, এটি নিয়োগটি আরম্ভ নয় initial
মাইক সিমুর

4
@ পাউল 23: এটি সত্য (ধরে নিচ্ছেন আপনার অর্থ operator=নয় operator()) ধরে নেওয়া, তবে এই প্রশ্নের সাথে খুব বেশি কিছু করার নেই। উদাহরণটি অ্যাসাইনমেন্টের ফলাফল সহ কিছুই করে না।
মাইক সিমুর

4
@ পল23 A()কল করে না operator(), এটি কোনও ধরণের অবজেক্ট তৈরি করে A
ইন্টারজয়

4
এটি কোনও সূচনা হতে পারে না কারণ কোনও ঘোষণা নেই।
কোস

32

আপনি যদি সত্যিই চান, আপনি এটি সি ++ 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=। এটি ঘোষণাগুলিকে যথাক্রমে মূল্য এবং মূল্যগুলির জন্য নির্বাচিত করে তোলে। যাইহোক, মূল সংস্করণ, যখন ওভারলোড রেজোলিউশন দ্বারা নির্বাচন করা হয় তখন প্রোগ্রামটি দূষিত হয় কারণ এটি মুছে ফেলা হয়।

ডিফল্ট জেনারেটেড অপারেটর =, তবে কোনও রেফ-কোয়ালিফায়ার নেই, যার অর্থ এটি উভয় স্তর এবং মূল্যবোধের জন্য বলা যেতে পারে; এই কারণেই প্রশ্নে কোডটি সংকলন করে, যদিও A()এটি একটি মূল্যবান।


1

সি ++ সংকলক একটি ডিফল্ট নির্মাতার সাথে সমস্ত ক্লাস সরবরাহ করে, যা আপনার কোডের সাথে সম্মত হয়, যখন আপনি বলি A () = A (); এটি কেবল একটি নামহীন অবজেক্টের সাথে কনস্ট্রাক্টরকে অনুরোধ করে এবং ফাংশনটি নির্মিত বস্তুর (অন্তর্নিহিত) রেফারেন্স দেয়। এটাই...

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.