আমি চেইন-টাইপের একটি শ্রেণি তৈরি করছি, যেমন নীচের ছোট উদাহরণ। দেখে মনে হচ্ছে সদস্যের কাজগুলি শৃঙ্খলাবদ্ধ করার সময়, অনুলিপিটি প্রস্তুতকারককে অনুরোধ করা হয়েছিল। অনুলিপি নির্মাণকারী কল থেকে মুক্তি পাওয়ার কোনও উপায় আছে কি? আমার খেলনা উদাহরণের নীচে, এটি স্পষ্ট যে আমি কেবল অস্থায়ীদের সাথেই কাজ করছি এবং এইভাবে "উচিত" (সম্ভবত মান অনুসারে নয়, তবে যৌক্তিকভাবে) এলিজেন হওয়া উচিত। দ্বিতীয় সেরা পছন্দ, এলিজির অনুলিপি করা, মুভ কনস্ট্রাক্টরকে ডেকে আনার জন্য হবে, তবে এটি ক্ষেত্রে নয়।
class test_class {
private:
int i = 5;
public:
test_class(int i) : i(i) {}
test_class(const test_class& t) {
i = t.i;
std::cout << "Copy constructor"<< std::endl;
}
test_class(test_class&& t) {
i = t.i;
std::cout << "Move constructor"<< std::endl;
}
auto& increment(){
i++;
return *this;
}
};
int main()
{
//test_class a{7};
//does not call copy constructor
auto b = test_class{7};
//calls copy constructor
auto b2 = test_class{7}.increment();
return 0;
}
সম্পাদনা: কিছু স্পষ্টতা। 1. এটি অপ্টিমাইজেশন স্তরের উপর নির্ভর করে না। ২. আমার আসল কোডে আমার কাছে ইনটসের চেয়ে আরও জটিল (উদার হিপ বরাদ্দ) অবজেক্ট রয়েছে
auto b = test_class{7};
অনুলিপি নির্মাণকারীকে কল দেয় না কারণ এটি সত্যই সমতুল্য test_class b{7};
এবং সংকলকরা এই কেসটি সনাক্ত করতে যথেষ্ট স্মার্ট এবং তাই সহজেই কোনও অনুলিপি এলিডে রাখতে পারে। একই জন্য করা যায় না b2
।
std::cout
আপনার অনুলিপি কর্টারে আসলে আপনার কাছে কি I / O ( ) আছে? এটি ছাড়া অনুলিপিটি অপ্টিমাইজ করা উচিত।