কেন একটি কনস্টিভাল ফাংশন অনির্ধারিত আচরণের অনুমতি দেয়?


16

সি ++ এ ধ্রুবক প্রকাশের খুব ঝরঝরে সম্পত্তি রয়েছে: তাদের মূল্যায়নের সাথে অপরিবর্তিত আচরণ থাকতে পারে না ( 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


2
in call to 'f(3)'- এটা অদ্ভুত! যাত্রা। আপনি f(123)ঝনঝন করা সতর্কতা সম্পর্কে in call to 'f(119)'
কামিলকুক

আমি মনে করি এটি কেবল একটি বাগ। মানটি পরিষ্কার যে "তাত্ক্ষণিকভাবে প্রার্থনা একটি ধ্রুবক প্রকাশ হতে হবে"। তবে এটি আরও সম্ভব যে আরও জটিল কিছু চলছে (যেমন, সম্ভবত সেই প্রয়োজনীয়তাটি সরানো হচ্ছে এবং কলং নতুন আচরণটি বাস্তবায়ন করছে)।
ব্রায়ান

3
সংকলক বাগ। এখানে কিছু দেখার নেই, সামনে চল।
টিসি

1
@ জেস্পার জুহল সম্পন্ন হয়েছে
মিখাইল

4
@ স্টিরিটেলার ইন্টিজার্স দুটিটির পরিপূরক তবে ওভারফ্লো এখনও অপরিজ্ঞাত।
ব্যারি

উত্তর:


2

এটি একটি সংকলক বাগ। অথবা, আরও স্পষ্ট করে বলতে গেলে এটি একটি "নিম্নচিকিত" বৈশিষ্ট্য ( বাগজিলায় মন্তব্যটি দেখুন ):

হ্যাঁ - মনে হচ্ছে কনস্টিভাল এখনও কার্যকর হয়নি, https://clang.llvm.org/cxx_status.html অনুসারে

(মূলশব্দটি সম্ভবত যুক্ত করা হয়েছে তবে প্রকৃত বাস্তবায়ন সমর্থন নয়)

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