সংক্ষিপ্ত উত্তরটি কেবল কার্যকর নয় static
, এটি সর্বদা পছন্দসই হবে।
প্রথমে এটি দ্রষ্টব্য static
এবং constexpr
একে অপরের থেকে সম্পূর্ণ স্বাধীন। static
মৃত্যুর সময় বস্তুর আজীবন সংজ্ঞা দেয়; constexpr
সংকলনের সময় অবজেক্টটি উপলভ্য হওয়া উচিত তা নির্দিষ্ট করে। সংকলন এবং সম্পাদন হ'ল সময় এবং স্থান উভয় ক্ষেত্রেই বিরক্তি এবং বিচ্ছিন্ন। সুতরাং প্রোগ্রামটি সংকলিত হয়ে গেলে constexpr
আর প্রাসঙ্গিক হয় না।
ঘোষিত প্রতিটি পরিবর্তনশীল constexpr
সুস্পষ্টভাবে const
তবে const
এবং static
প্রায় অরথগোনাল ( static const
পূর্ণসংখ্যার সাথে মিথস্ক্রিয়া ব্যতীত ) are
C++
অবজেক্ট মডেল (§1.9) যে সব অন্যান্য তুলনায় বিট-ক্ষেত্র মেমরি অন্তত একটি বাইট ব্যাপৃত এবং ঠিকানা রয়েছে বস্তু প্রয়োজন; তদুপরি একটি নির্দিষ্ট মুহুর্তে একটি প্রোগ্রামে পর্যবেক্ষণযোগ্য এই জাতীয় সমস্ত বস্তুর অবশ্যই আলাদা ঠিকানা থাকতে হবে (অনুচ্ছেদ 6)। স্থানীয় কম-স্ট্যাটিক কনস্ট অ্যারের সাথে ফাংশনটির প্রতিটি অনুরোধের জন্য স্ট্যাকের জন্য একটি নতুন অ্যারে তৈরি করার জন্য এটি সংকলকটির পুরোপুরি প্রয়োজন হয় না, কারণ সংকলক as-if
নীতিতে আশ্রয় নিতে পারে তবে শর্ত থাকে যে এটি প্রমাণ করতে পারে যে এই জাতীয় অন্য কোনও জিনিস হতে পারে না পালিত।
দুর্ভাগ্যক্রমে, এটি প্রমাণ করা সহজ হবে না, যদি না ফাংশনটি তুচ্ছ হয় (উদাহরণস্বরূপ, এটি অন্য কোনও ফাংশনকে কল করে না যার দেহ অনুবাদ ইউনিটে দৃশ্যমান নয়) কারণ অ্যারে, সংজ্ঞা অনুসারে কমবেশি, ঠিকানাগুলি। সুতরাং বেশিরভাগ ক্ষেত্রে, অস্থির const(expr)
অ্যারেটি প্রতিটি অনুরোধে স্ট্যাকের উপর পুনরায় তৈরি করতে হবে, যা সংকলন সময়ে এটি গণনা করতে সক্ষম পয়েন্টকে পরাস্ত করে।
অন্যদিকে, একটি স্থানীয় static const
অবজেক্ট সমস্ত পর্যবেক্ষক দ্বারা ভাগ করা হয় এবং তদ্ব্যতীত এটির সংজ্ঞা দেওয়া ফাংশনটি কখনও না বলা হলেও এটি আরম্ভ করা যেতে পারে। সুতরাং উপরেরগুলির কোনওটি প্রযোজ্য নয়, এবং একটি সংকলক কেবল এটির একটি একক উদাহরণ উত্পন্ন করতে বিনামূল্যে নয়; এটি কেবলমাত্র পঠনযোগ্য স্টোরেজে এটির একক উদাহরণ উত্পন্ন করতে পারে।
সুতরাং আপনি অবশ্যই static constexpr
আপনার উদাহরণ ব্যবহার করা উচিত ।
তবে, এমন একটি মামলা রয়েছে যেখানে আপনি ব্যবহার করতে চাইবেন না static constexpr
। যদি না কোনও constexpr
ঘোষিত অবজেক্ট হয় হয় ওডিআর-দ্বারা ব্যবহৃত বা ঘোষিত না হয় static
, সংকলক এটি মোটেও অন্তর্ভুক্ত না করতে মুক্ত। এটি বেশ কার্যকর, কারণ এটি constexpr
অপ্রয়োজনীয় বাইট দ্বারা সংকলিত প্রোগ্রামকে দূষিত না করে সংকলন -অস্থায়ী অ্যারির ব্যবহারের অনুমতি দেয় । সেক্ষেত্রে আপনি স্পষ্টতই ব্যবহার করতে চাইবেন না static
, যেহেতু static
রানটাইমের সময় অবজেক্টটি উপস্থিত থাকতে বাধ্য করা হবে।
const
কোনওconst
বস্তু থেকে দূরে ফেলতে পারবেন না , কেবলconst X*
কোনটি থেকে কোনটি নির্দেশ করেX
। তবে সে কথাটি নয়; মুল বক্তব্যটি হ'ল স্বয়ংক্রিয় বস্তুগুলির স্থির ঠিকানা থাকতে পারে না। যেমনটি আমি বলেছি,constexpr
সংকলনটি শেষ হয়ে গেলে অর্থবহ হওয়া বন্ধ হয়ে যায়, তাই ফেলে দেওয়ার মতো কিছুই নেই (এবং সম্ভবত বেশিরভাগ কিছুই কিছুই নেই, কারণ অবজেক্টটি রানটাইমের সময় উপস্থিত থাকার নিশ্চয়তাও দেয় না।)