কি হচ্ছে ?
আপনি যখন একটি তৈরি করেন Taxi
, আপনি একটি Car
সাবওবজেক্টও তৈরি করেন । এবং ট্যাক্সিটি ধ্বংস হয়ে গেলে, উভয় জিনিসই ধ্বংস হয়ে যায়। আপনি যখন ফোন করবেন তখন মানটি দিয়ে test()
পাস করুন Car
। সুতরাং দ্বিতীয়টি Car
অনুলিপি তৈরি হয় এবং যখন test()
বাকী থাকে তখন ধ্বংস হয়ে যায়। সুতরাং আমাদের 3 টি ডিসস্ট্রাক্টরের ব্যাখ্যা রয়েছে: প্রথম এবং দু'টি ধারাবাহিকতায় শেষ।
চতুর্থ ডেস্ট্রাক্টর (এটি ক্রমের দ্বিতীয়টি) অপ্রত্যাশিত এবং আমি অন্য সংকলকগুলির সাথে পুনরুত্পাদন করতে পারিনি।
এটি যুক্তির Car
উত্স হিসাবে কেবল অস্থায়ীভাবে তৈরি হতে Car
পারে। যেহেতু Car
যুক্তি হিসাবে সরাসরি কোনও মান সরবরাহ করার সময় এটি ঘটে না , তাই আমার সন্দেহ হয় এটি রূপান্তর করার Taxi
জন্য Car
। এটি অপ্রত্যাশিত, যেহেতু Car
প্রত্যেকটিতে ইতিমধ্যে একটি সাবোবজেক্ট রয়েছে Taxi
। অতএব আমি মনে করি যে সংকলকটি একটি টেম্পে অপ্রয়োজনীয় রূপান্তর করে এবং অনুলিপিটি এড়াতে পারত এমন অনুলিপিটি এলিয়েন্সটি করে না।
মন্তব্যগুলিতে স্পষ্টতা দেওয়া:
আমার দাবিগুলি যাচাই করার জন্য ভাষা-আইনজীবীর মানক রেফারেন্স সহ এখানে স্পষ্টতা:
- রূপান্তরটি আমি এখানে উল্লেখ করছি, এটি কনস্ট্রাক্টরের রূপান্তর
[class.conv.ctor]
, অর্থাৎ অন্য শ্রেণীর (এখানে ট্যাক্সি) আর্গুমেন্টের ভিত্তিতে এক শ্রেণীর (এখানে গাড়ি) একটি অবজেক্ট তৈরি করা।
- এই রূপান্তরটি এর
Car
মান ফেরত দেওয়ার জন্য একটি অস্থায়ী বস্তু ব্যবহার করে । এই সংকলকটির দ্বারা একটি অনুলিপি তৈরি করার অনুমতি দেওয়া হবে [class.copy.elision]/1.1
, যেহেতু অস্থায়ী নির্মাণের পরিবর্তে এটি সরাসরি প্যারামিটারে ফিরে আসার মানটি তৈরি করতে পারে।
- সুতরাং যদি এই টেম্পটি পার্শ্ব-প্রতিক্রিয়া দেয় তবে এটি কারণ কারণ সংকলক দৃশ্যত এই সম্ভাব্য অনুলিপিটি ব্যবহার করে না। এটি ভুল নয়, যেহেতু অনুলিপিটি অনুলিপি করা বাধ্যতামূলক নয়।
অ্যানাইসিসের পরীক্ষামূলক নিশ্চিতকরণ
আমি এখন একই সংকলকটি ব্যবহার করে আপনার কেস পুনরুত্পাদন করতে এবং যা চলছে তা নিশ্চিত করার জন্য একটি পরীক্ষা আঁকতে পারি।
উপরের আমার ধারণাটি ছিল যে সংকলকটি সাব-সাবটিক্যাল প্যারামিটার পাসিং প্রক্রিয়াটি নির্বাচন করেছে, Car(const &Taxi)
এর Car
সাবোবজেক্ট থেকে সরাসরি অনুলিপি নির্মাণের পরিবর্তে কনস্ট্রাক্টর রূপান্তর ব্যবহার করে Taxi
।
তাই আমি কলিং চেষ্টা test()
কিন্তু স্পষ্টভাবে ভোটদান Taxi
একটি মধ্যে Car
।
আমার প্রথম প্রচেষ্টা পরিস্থিতি উন্নতি করতে সফল হয়নি। সংকলক এখনও suboptimal নির্মাণকারী রূপান্তর ব্যবহৃত:
test(static_cast<Car>(taxi)); // produces the same result with 4 destructor messages
আমার দ্বিতীয় প্রচেষ্টা সফল। এটি পাশাপাশি Car
ingালাইও করে তবে সংকলকটির সাবোবজেক্টটি ব্যবহার করার জন্য Taxi
এবং এই নির্বোধ অস্থায়ী বস্তুটি তৈরি না করেই পয়েন্টার কাস্টিং ব্যবহার করে :
test(*static_cast<Car*>(&taxi)); // :-)
এবং আশ্চর্য: এটি প্রত্যাশার মতো কাজ করে, কেবলমাত্র 3 টি ধ্বংসের বার্তাটি উত্পাদন করে :-)
সমাপ্তি পরীক্ষা:
একটি চূড়ান্ত পরীক্ষায়, আমি রূপান্তর দ্বারা একটি কাস্টম নির্মাণকারী সরবরাহ করেছি:
class Car {
...
Car(const Taxi& t); // not necessary but for experimental purpose
};
এবং এটি দিয়ে বাস্তবায়ন *this = *static_cast<Car*>(&taxi);
। নির্বোধ শোনায়, তবে এটি এমন কোড উত্পন্ন করে যা কেবলমাত্র 3 জন ডেস্ট্রাক্টর বার্তা প্রদর্শন করবে, এইভাবে অপ্রয়োজনীয় অস্থায়ী বস্তু এড়ানো হবে।
এটি এই ভাবনার দিকে পরিচালিত করে যে সংকলকটিতে কোনও বাগ থাকতে পারে যা এই আচরণের কারণ হয়ে দাঁড়ায়। এটি কিছুটা ক্ষেত্রে বেস ক্লাস থেকে সরাসরি অনুলিপি তৈরির সম্ভাবনা মিস করার সম্ভাবনা রয়েছে।
Taxi
Car