অপারেটর নতুন () দিয়ে শ্রেণি সি এর একটি নতুন অবজেক্ট তৈরি করা এখানে একটি ত্রুটি দেয়:
class C
{
public:
C() {}
virtual ~C() {}
void operator delete(void*) = delete;
};
int main()
{
C* c = new C;
}
সঙ্গে C2280: 'void C::operator delete(void *)': function was explicitly deleted
কিন্তু আমি যখন প্রতিস্থাপন C() {}
সঙ্গে C() = default;
বা যাতে কম্পাইলার একটি ডিফল্ট কন্সট্রাকটর (যা আমি বিশ্বাস করি সঙ্গে একই প্রভাব রয়েছে সন্নিবেশ লাইন অপসারণ = default
), কোড কম্পাইল এবং চালানো হবে।
সংঘটিত-উত্পাদিত ডিফল্ট কনস্ট্রাক্টর এবং ব্যবহারকারী-সংজ্ঞায়িত ডিফল্ট কনস্ট্রাক্টরের মধ্যে পার্থক্যগুলি কী তা ঘটায়?
আমি এই পোস্টিংয়ে কিছু ইঙ্গিত পেয়েছি , তবে ডি ক্লাস্টিকটি এখানে (ব্যবহারকারীর দ্বারা সরবরাহ করা কনস্ট্রাক্টর ছাড়াই) তুচ্ছ নয় কারণ ডেস্ট্রাক্টর ভার্চুয়াল, তাই না?
সর্বশেষ ভিজ্যুয়াল স্টুডিও, সি ++ 17 দিয়ে সংকলিত।
operator delete()
কনস্ট্রাক্টর ম্যানুয়ালি লিখিত হয়েছে বা সুস্পষ্টভাবে উত্পাদিত হয়েছে কিনা সে সম্পর্কিত অনুরূপ ডায়াগনস্টিক । যা আমার প্রত্যাশার সাথে সামঞ্জস্যপূর্ণ - যেহেতু একটি ব্যতিক্রম new
প্রকাশের দ্বারা ছোঁড়া হতে পারে , তাই সংকলকটি অ্যাক্সেস করতে হবে operator delete()
।
noexcept
কোড সংকলন তৈরি করবে, তবে কীভাবে ...?
noexcept
সেবাস্তিয়ানআরডল উল্লিখিত হিসাবে থাকে, তবে একটি কল operator delete
অন্তর্ভুক্ত করার দরকার নেই। এছাড়াও g ++ কেবলমাত্র যদি অভিযোগকারী ভার্চুয়াল হয় তবে অভিযোগ করে। অন্যথায় এটি সর্বদা সংকলন করে, এমনকি যদি কনস্ট্রাক্টর নিক্ষেপ করে।
noexcept