সি ++ এ ধ্রুবক প্রকাশের খুব ঝরঝরে সম্পত্তি রয়েছে: তাদের মূল্যায়নের সাথে অপরিবর্তিত আচরণ থাকতে পারে না ( 7.7.4.7 ):
অ্যাবস্ট্রাক্ট মেশিনের নিয়ম অনুসরণ করে ([intro.execution]) ই এর মূল্যায়ন যদি না হয় তবে একটি এক্সপ্রেশন ই একটি মূল ধ্রুবক অভিব্যক্তি, নিম্নলিখিতগুলির মধ্যে একটিকে মূল্যায়ন করবে:
...
এই দস্তাবেজের [সিপিপি] মাধ্যমে [ইন্ট্রো] এ উল্লিখিত বর্ণনামূলক আচরণের একটি অপারেশন [দ্রষ্টব্য: উদাহরণস্বরূপ, স্বাক্ষরকৃত পূর্ণসংখ্যার ওভারফ্লো ([এক্সপ্রেসপ্রপ]), নির্দিষ্ট পয়েন্টার গাণিতিক ([এক্সপ্রেসড্যাড]), শূন্য দ্বারা বিভাজন, বা নির্দিষ্ট শিফট অপারেশন - শেষ নোট];
মান জমা করার চেষ্টা করার 13!
মধ্যে constexpr int
প্রকৃতপক্ষে একটা চমৎকার কম্পাইল ত্রুটি উৎপাদ :
constexpr int f(int n)
{
int r = n--;
for (; n > 1; --n) r *= n;
return r;
}
int main()
{
constexpr int x = f(13);
return x;
}
আউটপুট:
9:19: error: constexpr variable 'x' must be initialized by a constant expression
constexpr int x = f(13);
^ ~~~~~
4:26: note: value 3113510400 is outside the range of representable values of type 'int'
for (; n > 1; --n) r *= n;
^
9:23: note: in call to 'f(3)'
constexpr int x = f(13);
^
1 error generated.
(বিটিডব্লিউটি ত্রুটি কেন "চ '(' ফ '(3)' 'বলছে, যখন এটি চ (13) এর কল? ..)
তারপরে, আমি এখান constexpr
থেকে সরিয়ে দিই x
, তবে f
একটি তৈরি করি consteval
। ডক্স অনুসারে :
কনস্টিভাল - নির্দিষ্ট করে যে কোনও ফাংশন একটি তাত্ক্ষণিক ফাংশন, অর্থাৎ ফাংশনের প্রতিটি কল অবশ্যই একটি সংকলন-সময় ধ্রুবক উত্পাদন করে
আমি আশা করি যে এই জাতীয় প্রোগ্রাম আবার একটি সংকলন ত্রুটির কারণ হবে। তবে পরিবর্তে, প্রোগ্রামটি সংকলন করে এবং ইউবি দিয়ে চলে ।
কেন এমন?
ইউপিডি: কমেন্টাররা পরামর্শ দিয়েছে যে এটি একটি সংকলক বাগ। আমি এটি রিপোর্ট করেছি: https://bugs.llvm.org/show_bug.cgi?id=43714
in call to 'f(3)'
- এটা অদ্ভুত! যাত্রা। আপনিf(123)
ঝনঝন করা সতর্কতা সম্পর্কেin call to 'f(119)'
।