মাপের (এনাম) মাপের (এসডিডি: আন্ডারলাইং_ টাইপ <এনাম> :: টাইপ) থেকে আলাদা হতে পারে?


16

সম্প্রতি একটি কোড পর্যালোচনা এসেছিল যা নিম্নলিখিত উদাহরণে:

enum class A : uint8_t
{
    VAL1, VAL2 
};

...
std::vector<A> vOfA; // Assume this is sized and full of some stuff.
std::memcpy(wire_buffer, vOfA.data(), vOfA.size() * sizeof(A));

এর sizeof(std::underlying_type<A>::type)পরিবর্তে আমাদের ব্যবহার করা উচিত sizeof(A)এগুলি কি কখনও পৃথক হতে পারে? কারও কি এমন মানদণ্ড রয়েছে যা এর গ্যারান্টি দেয়?


সংযোগস্থাপন সি একটি enum টাইপ ডাটা আকার কি ++,? (যা স্কোপযুক্তগুলি কভার করার জন্য তৈরি করা উচিত :-)।
ওক গাছের ফল

3
এমনকি যদি তারা একই আকার হয় (যা সম্ভবত এর চেয়ে বেশি) তবে ব্যবহারের বিরুদ্ধে যুক্তি কী sizeof(A)? এছাড়াও: যদি সেগুলি ভিন্ন আকারের (অসম্ভব) হয় sizeof(std::underlying_type<A>)তবে এটি ব্যবহার করা ভুল হবে।
Sander De Dycker

1
sizeof(std::underlying_type<A>)সম্ভবত 1। মানে ::type?
এলএফ

1
@ স্যান্ডারডাইকার হ্যাঁ, Aএস এর সাথে কাজ করার সময় , অবশ্যই একটি ব্যবহার করতে চায় sizeof(A)এবং কোডটি কী ধরণের তা বিবেচনা করা উচিত নয় A
ওক গাছের ফল

@ এলএফ হ্যাঁ, টাইপো শিরোনাম এটি সঠিক ছিল।
চমত্কার মিস্টার ফক্স

উত্তর:


12

সি ++ 03 এ এটির নিশ্চয়তা ছিল (ভাল, যাহাই হউক না খালি গণনার জন্য)।

[dcl.enum] গণনার ঘোষণা (জোর আমার)

6 একটি গণনার অন্তর্নিহিত ধরণ হল একটি অবিচ্ছেদ্য প্রকার যা গণনাতে সংজ্ঞায়িত সমস্ত গণকের মানকে উপস্থাপন করতে পারে। যদি কোনও অবিচ্ছেদ্য প্রকার সমস্ত গণকের মানকে প্রতিনিধিত্ব করতে না পারে, তবে গণনাটি অ-গঠিত। এটি রূপায়ণ-সংজ্ঞায়িত যা কোন সংখ্যার জন্য অন্তর্নিহিত প্রকারটি অন্তর্নিহিত প্রকার হিসাবে ব্যবহৃত হয় তা বাদে অন্তর্নিহিত প্রকারটি int এর চেয়ে বড় হবে না যদি না কোনও এনুম্যরেটারের মান কোনও স্বাক্ষরযুক্ত বা স্বাক্ষরযুক্ত ইনতে ফিট না করে। যদি গণনাকারী-তালিকা খালি, অন্তর্নিহিত ধরনের যেন শুমার মান 0. একটি একক গণনাকারী ছিল মান sizeof()একটি শুমার ধরন, শুমার প্রকারের একটি বস্তু, অথবা একটি গণনাকারী প্রয়োগ, মান sizeof()প্রয়োগ করা অন্তর্নিহিত টাইপ

তারপরে এন 2347 আসলো , যে কাগজটি দৃ strongly়ভাবে টাইপ করা গণনা ( enum class) এবং অনির্ধারিত গণনাগুলিতে অন্যান্য বর্ধনের জন্য গৃহীত হয়েছিল এবং এতে বাক্যটি মুছে ফেলা হয়েছিল। আকর্ষণীয়ভাবে যথেষ্ট, প্রস্তাবের পূর্ববর্তী সংস্করণ, এন 2213- এ সরানো বাক্যটির প্রতিস্থাপন ছিল। তবে এটি যে সংস্করণটি গৃহীত হয়েছিল তা তৈরি করে নি।

সুতরাং আধুনিক সি ++ তে মাপের সমান হওয়ার কোনও বাধ্যবাধকতা নেই। যদিও ব্যবহারিক দৃষ্টিকোণ থেকে, বাস্তবায়নগুলি গণনা মাপের জন্য সি ++ 03 দ্বারা নির্ধারিত আচরণটি পরিবর্তিত করেছে বলে সম্ভাবনা কম।

এটি মান হিসাবে একটি ত্রুটি হিসাবে বিবেচনা করতে পারে।


2
ভাষাতে অস্তিত্ব নেই এমন বৈশিষ্ট্যের জন্য কীভাবে সি ++ 03 তে কোনও কিছুর গ্যারান্টি দেওয়া যেতে পারে? ওও
লাইটনেস রেস

4
@ লাইটনেসেসেসিথমোনিকা - অন্তর্নিহিত ধরণের ধারণাটি নতুন নয়। এটি ঠিক যে সি ++ 11 আপনাকে এটি নিজেরাই নির্দিষ্ট করার অনুমতি দিয়েছে।
গল্পগ্রাহক - আনস্ল্যান্ডার মনিকা

আমি জানি। একটি স্কোপড এনাম ( enum class) এর ধারণাটি নতুন।
অরবিট

@ লাইটনেসেসেসিথমোনিকা - আমি মনে করি যে কেউ এখানে সম্ভাব্যতার সাথে প্রস্তাবটিকে দোষ দিতে পারে। এটি দুটি কাজ করেছে, স্কোপযুক্ত গণনাগুলি প্রবর্তন করেছে এবং সমস্ত অঙ্ককে (কেবল স্কোপযুক্ত নয়) তাদের অন্তর্নিহিত ধরণের সেট সেট করার অনুমতি দিয়েছে। সুতরাং সি ++ 03 এ "গ্যারান্টিযুক্ত"।
গল্পগ্রাহক - আনস্ল্যান্ডার মনিকা

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