সি ++ 17 ইনলাইন ভেরিয়েবলগুলি উপস্থাপন করে
সি ++ 17 constexpr staticসদস্যের ভেরিয়েবলগুলির জন্য এই সমস্যাটি সমাধান করে যদি এটি অদ্ভুত-ব্যবহৃত হয় তবে লাইনটির বাইরে থাকা সংজ্ঞা প্রয়োজন। প্রাক-সি ++ 17 বিশদের জন্য এই উত্তরটির দ্বিতীয়ার্ধটি দেখুন।
প্রস্তাবনা P0386 ইনলাইন ভেরিয়েবল প্রয়োগ করার ক্ষমতা প্রবর্তন inlineসুনির্দিষ্টভাবে উল্লেখ করা ভেরিয়েবল করতে। বিশেষত এই ক্ষেত্রে স্ট্যাটিক সদস্য ভেরিয়েবলের জন্য constexprবোঝায় inline। প্রস্তাবে বলা হয়েছে:
ইনলাইন স্পেসিফায়ারটি ভেরিয়েবলের পাশাপাশি ফাংশনেও প্রয়োগ করা যেতে পারে। একটি ভেরিয়েবল ঘোষিত ইনলাইনটিতে একই রকম শব্দার্থক শব্দ রয়েছে যেমন একটি ইনলাইন ঘোষিত ফাংশন: এটি সংজ্ঞায়িত করা যেতে পারে, একইভাবে, একাধিক অনুবাদ ইউনিটে, প্রতিটি অনুবাদ ইউনিটে যেখানে এটি অদ্ভুতভাবে ব্যবহৃত হয় তাকে অবশ্যই সংজ্ঞায়িত করা যেতে পারে, এবং প্রোগ্রামটির আচরণ যেমন হয় ঠিক এক পরিবর্তনশীল আছে।
এবং [বেসিক.ডিফ] পি 2 সংশোধিত:
একটি ঘোষণা একটি সংজ্ঞা হয় যদি না
...
- এটি শ্রেণীর সংজ্ঞার বাইরে স্থিতিশীল ডেটা সদস্য হিসাবে ঘোষিত হয় এবং ভেরিয়েবলটি শ্রেণিবদ্ধের সাথে কনস্টেক্সপ্রাইফ স্পেসিফায়ার দিয়ে সংজ্ঞায়িত করা হয় (এই ব্যবহারটি অবচিত হয়; দেখুন [depr.static_constexpr]),
...
এবং [depr.static_constexpr] যুক্ত করুন :
পূর্ববর্তী সি ++ আন্তর্জাতিক স্ট্যান্ডার্ডগুলির সাথে সামঞ্জস্যের জন্য, একটি সংশ্লেষের স্থিতিশীল ডেটা সদস্যকে প্রাথমিকভাবে বিনা প্রাথমিকভাবে ক্লাসের বাইরে পুনরায় ঘোষিত করা যেতে পারে। এই ব্যবহার হ্রাস করা হয়। [উদাহরণ:
struct A {
static constexpr int n = 5; // definition (declaration in C++ 2014)
};
constexpr int A::n; // redundant declaration (definition in C++ 2014)
- শেষ উদাহরণ]
সি ++ 14 এবং তার আগেরটি
সি ++ ০৩ এ, কেবলমাত্র কনস্ট্যান্ট ইন্টিগ্রাল বা কনস্ট এনুমুরেশন ধরণের জন্য শ্রেণিক প্রারম্ভিক সরবরাহ করার অনুমতি দেওয়া হয়েছিল , সি ++ 11 এ এটি ব্যবহার করে আক্ষরিক ধরণেরconstexpr প্রসারিত করা হয়েছিল ।
সি ++ ১১-তে, কোনও স্থির constexprসদস্যের যদি এটি অদ্ভুত-ব্যবহৃত না হয় তবে আমাদের জন্য একটি নেমস্পেসের স্কোপ সংজ্ঞা সরবরাহ করার দরকার নেই , আমরা এটি খসড়া সি ++ 11 স্ট্যান্ডার্ড বিভাগ 9.4.2 [ক্লাস.স্ট্যাটিক.ডাটা] থেকে দেখতে পাচ্ছি যা বলেছে ( জোর আমার এগিয়ে যাচ্ছে ):
[...] আক্ষরিক ধরণের স্ট্যাটিক ডেটা সদস্যকে কনস্টেক্সপ্রাইফ স্পেসিফায়ার দিয়ে ক্লাস সংজ্ঞাতে ঘোষণা করা যেতে পারে; যদি তা হয় তবে এর ঘোষণাপত্রে একটি ব্রেস-বা-সমান-আরম্ভকারী নির্দিষ্ট করা হবে যাতে প্রতিটি প্রাথমিক-ক্লোজ যা একটি অ্যাসাইনমেন্ট-এক্সপ্রেশন থাকে একটি ধ্রুবক প্রকাশ। [দ্রষ্টব্য: এই উভয় ক্ষেত্রেই সদস্য স্থির মত প্রকাশের জন্য উপস্থিত হতে পারে। Noteend নোট]
প্রোগ্রামটি যদি অদ্ভুতভাবে ব্যবহৃত হয় (3.2) প্রোগ্রামটিতে নাম তালিকাতে স্কোপে সংজ্ঞায়িত করা হবে এবং নেমস্পেস স্কোপ সংজ্ঞাটিতে কোনও আরম্ভকারী নেই contain
তাহলে প্রশ্নটি হয়ে ওঠে, এখানে কি baz অদ্ভুত ব্যবহার রয়েছে:
std::string str(baz);
এবং উত্তর হ্যাঁ , এবং তাই আমাদের পাশাপাশি একটি নেমস্পেস স্কোপ সংজ্ঞাও প্রয়োজন।
সুতরাং আমরা কীভাবে নির্ধারণ করব যে কোনও ভেরিয়েবল অদ্ভুত-ব্যবহৃত হয় ? বিভাগে মূল সি ++ 11 3.2 শব্দকথা [বেসিক.ডেফ.অর্ডার] বলেছেন:
একটি এক্সপ্রেশনটি সম্ভাব্যভাবে মূল্যায়ন করা হয় যদি না এটি একটি মূল্যহীন অপরেনড (ক্লজ 5) বা এর একটি এক্সপ্রেশন হয়। একটি পরিবর্তনশীল যার নামটি সম্ভাব্য-মূল্যায়িত এক্সপ্রেশন হিসাবে উপস্থিত হয় অদ্ভুত-ব্যবহৃত হয় যদি না
এটি এমন কোনও বস্তু হয় যা ধ্রুবক অভিব্যক্তিতে উপস্থিত হওয়ার জন্য প্রয়োজনীয়তাগুলি পূরণ করে (5.19) এবং লভ্যু-টু-রালভ্য রূপান্তর (4.1) অবিলম্বে প্রয়োগ করা হয় ।
সুতরাং bazএকটি ধ্রুবক অভিব্যক্তি পাওয়া যায় তবে অ্যালbaz হওয়ার কারণে প্রযোজ্য না হওয়ায় অবধি লভ্যালু-থেকে-রালভ রূপান্তরটি তত্ক্ষণাত্ প্রয়োগ করা হয় না । এটি বিভাগে 4.1 [আবশ্যক] আচ্ছাদিত রয়েছে যা বলে:
নন-ফাংশন, নন-অ্যারে টাইপ টি এর একটি আচ্ছাদন (৩.১০) একটি মূল্যে রূপান্তর করা যেতে পারে 3৫ [...]
অ্যারে-থেকে-পয়েন্টার রূপান্তরটিতে কী প্রয়োগ করা হয় ।
[বেসিক.ডেফ.অর্ডার] এর এই শব্দটির ত্রুটি প্রতিবেদন 712 এর কারণে পরিবর্তন করা হয়েছিল যেহেতু কিছু ক্ষেত্রে এই শব্দটির আওতাভুক্ত হয়নি তবে এই পরিবর্তনগুলি এই মামলার ফলাফলগুলিকে পরিবর্তন করে না।