এটি বুঝতে enum, এটি ছাড়া বিনষ্টকারী বিবেচনা করে শুরু করুন:
~scoped_ptr() {
delete ptr_;
}
যেখানে ptr_একটি হল C*। যদি টাইপ Cএই সময়ে অসম্পূর্ণ, অর্থাত্ যে সব কম্পাইলার জানে struct C;তারপর, (1) একটি ডিফল্ট-জেনারেট do-কিছুই বিনাশকারী সি উদাহরণস্বরূপ ব্যবহার করা হয় দিকে ইঙ্গিত করলেন। কোনও স্মার্ট পয়েন্টার দ্বারা পরিচালিত কোনও সামগ্রীর জন্য এটি সঠিক জিনিস হওয়ার সম্ভাবনা কম।
যদি কোনও পয়েন্টার দিয়ে অসম্পূর্ণ প্রকারে মুছে ফেলা সর্বদা অপরিজ্ঞাত আচরণ ছিল, তবে স্ট্যান্ডার্ডটির এটি নির্ধারণ করতে এবং ব্যর্থ হওয়ার জন্য কেবল সংকলকটির প্রয়োজন হতে পারে। কিন্তু প্রকৃত ডেস্ট্রাক্টর যখন তুচ্ছ হয় তখন এটি সুনির্দিষ্টভাবে সংজ্ঞায়িত হয়: প্রোগ্রামার থাকতে পারে এমন জ্ঞান, তবে সংকলকটি নেই doesn't ভাষা কেন এটি সংজ্ঞায়িত করে এবং অনুমতি দেয় তা আমার বাইরেও, তবে সি ++ এমন অনেক অনুশীলনকে সমর্থন করে যা আজকে সেরা অনুশীলন হিসাবে বিবেচিত হয় না।
একটি সম্পূর্ণ টাইপ একটি জ্ঞাত আকার আছে, এবং তাই, একটি সম্পূর্ণ টাইপ sizeof(C)হলে এবং শুধুমাত্র Cপরিচিত সংঘটিতকারীর সাথে সংকলন করবে । সুতরাং এটি প্রহরী হিসাবে ব্যবহার করা যেতে পারে। একটি উপায় সহজ হবে
(void) sizeof(C);
আমি অনুমান করব যে কয়েকটি সংকলক এবং বিকল্পগুলির সাহায্যে সংকলকটি এটি সংকলন করা উচিত নয় এবং এটি enumযে এইরকম-অনুসারী সংযোজক আচরণটি এড়াতে পারে তা দেখার আগে এটি অপসারণ করে:
enum { type_must_be_complete = sizeof(C) };
enumকেবল একটি প্রত্যাখ্যানিত প্রকাশের চেয়ে পছন্দের বিকল্প বিকল্পটি কেবল ব্যক্তিগত পছন্দ।
অথবা জেমস টি। হুগেট এই উত্তরের মন্তব্যে যেমন পরামর্শ দিয়েছেন , " এনামগুলি সংকলনের সময় সিউডো-পোর্টেবল ত্রুটি বার্তা তৈরির উপায় হতে পারে"।
(1) অসম্পূর্ণ প্রকারের জন্য ডিফল্ট-উত্পন্ন ডু-নাথ ডেস্ট্রাক্টর পুরানো সমস্যা ছিল std::auto_ptr। এটি এত কুখ্যাত ছিল যে এটি পিআইএমপিএল আইডিয়ম সম্পর্কে একটি জিওটিডাব্লু আইটেমটিতে প্রবেশ করেছিল, এটি আন্তর্জাতিক সি ++ মানককরণ কমিটির সভাপতি হার্ব সটারের চেয়ার দ্বারা লেখা। অবশ্যই, আজকাল যেটি std::auto_ptrঅবহেলা করা হয়েছে, তার পরিবর্তে কেউ কেউ অন্য কোনও প্রক্রিয়া ব্যবহার করবে।
ptr_নিজেইsizeofযেমনsizeof(*ptr_)পরিবর্তেsizeof(C)।