কনস্ট অকার্যকর কি?


90

বর্ণনা বর্ণনা করে std::is_voidযে:

সদস্যটি ধ্রুবক মান প্রদান করে যা সত্যের সমান, যদি টি হ'ল টাইপ শূন্য, কনস্টেট শূন্যতা, উদ্বায়ী শূন্যতা, বা কনস্টেন্ট উদ্বায়ী শূন্য হয়।

তাহলে কী হতে পারে const void, বা ক volatile void?

এই উত্তরে বলা হয়েছে যে const voidরিটার্নের ধরণটি অবৈধ হবে (তবে উপাচার্য ++ 2015 তে সংকলিত)

const void foo() { }

যদি মান অনুসারে, const voidঅবৈধ (ভিসি ভুল হচ্ছে) - তবে কী const void?


15
আপনি যে উত্তরটির সাথে লিঙ্ক করেছেন সেটিতে এটি অকার্যকর হবে না বলে উল্লেখ করা হয়েছে, এটি বলে যে এটি "অর্থহীন" হবে, যার অর্থ আমি গ্রহণ করব " " voidছাড়াই কোনও সুবিধা দেয় না const"।

@hvd, উত্তরে বলা হয়েছে যে সংকলককে এই জাতীয় যোগ্যতা সম্পর্কে সতর্ক করা / ত্রুটি করা উচিত। এর মাধ্যমে আমি অনুমান করি যে সি ++ স্ট্যান্ডার্ড এর সাথে যোগ্যতার অনুমতি দেয় নাvoid
অজয়

4
উত্তরে বলা হয়েছে যে সংকলককে এই জাতীয় যোগ্যতার বিষয়ে সতর্ক করা উচিত, এটি কোনও ত্রুটির কথা উল্লেখ করে না এবং একটি ত্রুটিও ভুল হবে। এই মন্তব্যটি বাস্তবায়নের মানের সম্পর্কে, কনফারেন্সের বিষয়ে নয়, তবে আমি বুঝতে পারি যে মন্তব্যটি থেকে তা মোটেই পরিষ্কার নয়।

@ অজয় ​​স্ট্যান্ডার্ডটি নির্দিষ্ট করে না যে আপনি যখন অর্থহীন কোড ব্যবহার করেন তখন একটি সতর্কতা হওয়া উচিত। এই কোডটি কিছু করে না এমন একটি অতিরিক্ত ইঙ্গিত আপনাকে দেওয়ার জন্য এটি জিসিসির সিদ্ধান্ত ছিল। ভিসি কোনওভাবেই ভুল নয়।
ব্যবহারকারী 1942027

4
@ অজয় ​​উত্তরে বলা হয়েছে যে ঝাঁকুনি একটি সতর্কতা দেয় এবং এটি লেখকের মতে অন্যান্য সংকলকরাও উচিত। মান যদি এটির অনুমতি না দেয় তবে এটি একটি ত্রুটি হবে, সতর্কবার্তা নয়।
molbdnilo

উত্তর:


94

const voidএটি এমন একটি প্রকার যা আপনি একটি পয়েন্টার তৈরি করতে পারেন। এটি একটি সাধারণ অকার্যকর পয়েন্টারের মতো, তবে রূপান্তরগুলি ভিন্নভাবে কাজ করে। উদাহরণস্বরূপ, একটি const int*সুস্পষ্টভাবে একটিতে রূপান্তরিত হতে পারে না void*, তবে এটি স্পষ্টতই একটিতে রূপান্তরিত হতে পারে const void*। তেমনিভাবে, আপনার যদি একটি থাকে তবে এটি এটির পক্ষে তা const void*করতে পারে না তবে আপনি এটিতে এটি করতে পারেন ।static_castint*static_castconst int*

const int i = 10;
void* vp = &i;                           // error
const void* cvp = &i;                    // ok
auto ip = static_cast<int*>(cvp);        // error
auto cip = static_cast<const int*>(cvp); // ok

4
যদিও আপনার উত্তরটি ভাল, এটির কারণটি বর্ণনা করে না const void, তবে এটি শূন্য এবং অ-শূন্য পয়েন্টারগুলির চারপাশে [(নন) কনস্ট-নেসের সাথে] রয়েছে।
অজয়

26
@ অজয়: আমি একমত নই একজন const void*একমাত্র কারণ আপনি কি কখনও দেখতে হবে const void। এটি কোনও টেম্পলেট আর্গুমেন্ট হিসাবে প্রায় পাস করা যেতে পারে, তবে সেই যুক্তির ধরণটি *এর শেষে কেবল একবারে ইনস্ট্যান্ট করা হবে।
বেনিয়ামিন লিন্ডলি

@BenjaminLindley এছাড়াও আপনি দেখতে পারেন const voidযে প্রশ্ন ভাষা আইনজীবী জিজ্ঞেস করলেন
cpplearner

4
@ অজয়: একসময় এই প্রশ্নটি দর্শনের প্রশ্নে পরিণত হয়। এর "কারণ" const voidহ'ল সি ++ তে সমস্ত ধরণের তৈরি করা যায় const। এটি যেভাবে voidবিদ্যমান তা একইভাবে "বিদ্যমান" । @ বেঞ্জামিন লিন্ডলির উত্তরটি আপনাকে কখন এটি দেখবে এবং কীভাবে আপনি এটি ব্যবহার করবেন তা ব্যাখ্যা করে।
ক্রিস বেক

23

হিসাবে void, const voidএকটি অকার্যকর টাইপ। তবে, যদি const voidকোনও রিটার্ন টাইপ হয় তবে constএটি অর্থহীন (যদিও আইনী!), কারণ [এক্সপ্রেস] / 6 :

প্রাথমিক পর্যায়ে যদি প্রাথমিকভাবে " সিভি T " টাইপ থাকে , যেখানে Tসিভি-অযোগ্য বা অ-শ্রেণীর, নন-অ্যারে টাইপ থাকে তবে এক্সপ্রেশনটির ধরণটি Tআরও বিশ্লেষণের আগেই সামঞ্জস্য করা হয় ।

তবে এটি নিজেই একটি বৈধ টাইপ এবং উদাহরণস্বরূপ সি-স্ট্যান্ডার্ড লাইব্রেরি ফাংশনগুলিতে ঘটে , যেখানে এটি আর্গুমেন্ট পয়েন্টারগুলির সংশোধন-নির্ভুলতা নিশ্চিত করতে ব্যবহৃত হয়: তবে int const*রূপান্তরিত হতে পারে না ।void*void const*


const voidযেমন একটি রিটার্ন টাইপ ফাংশন ধরণের উপর প্রভাব ফেলে তাই এটি সম্পূর্ণ অর্থহীন নয়।
সিপ্লেয়ার্নার

4
@ ক্লিপ্লেনার ব্যতীত এটি প্রতিটি ব্যবহারিক অর্থেই রয়েছে, কারণ ফাংশনের স্বাক্ষর বা এটির কলটির ধরণের কোনওটিই প্রভাবিত হয় না।
কলম্বো

ভাল এটি একটি ফাংশন টেম্পলেট স্বাক্ষর পরিবর্তন করতে পারেন। তবুও +1
সিপ্লেয়ারিয়র

@ ক্লিয়ারিয়েনার ফেয়ার যথেষ্ট - এটি এখনও কীস্ট্রোকের অপচয়।
কলম্বো

আমরা সাধারণত দেখতে পাই: কনস্ট ইনট * অকার্যকর * যেতে পারে না, তবে কনস্ট অকার্যকর *।
ম্যাগগুইন

18

প্রকারভেদগুলি টেমপ্লেটগুলির ফলাফল হতে পারে; একটি টেমপ্লেট রাষ্ট্র পারে const T, এবং instantiated করা Tযেমন void

লিঙ্কযুক্ত উত্তরটি বিপথগামী বা বরং সীমাবদ্ধ কারণ এটি কোনও অ-টেম্পলেট ধরণের বিশেষ ক্ষেত্রে বিবেচনা করে এবং তারপরেও তা অর্থহীনconst void হতে পারে তবে এটি বৈধ কোড

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