[বেসরাল.স্কোপ.পিডিএসিএল] / সি ++ ২০ স্ট্যান্ডার্ডের খসড়ার 1 / এর একটি নোটে নিম্নোক্ত (অ-আদর্শিক) উদাহরণ রয়েছে ( পুল অনুরোধের মার্জ হওয়ার আগে থেকে 3580 এর আংশিক উক্তি , এই প্রশ্নের উত্তর দেখুন):
unsigned char x = x;
[...] এক্স এর নিজস্ব (অনির্দিষ্ট) মান দিয়ে শুরু করা হয়।
এটির কি আসলে C ++ 20 এ সু-সংজ্ঞায়িত আচরণ রয়েছে?
সাধারণত সূত্রের স্ব- সূচনাকরণের সূচনা সম্পন্ন হওয়ার আগেই এর মানকে অনির্দিষ্টT x = x;
করে রাখার দ্বারা নির্ধারিত আচরণ হয় । অনির্দিষ্ট মান মূল্যায়ন সাধারণত অনির্ধারিত আচরণ (ঘটায় [basic.indent] / 2 ), কিন্তু সেখানে একটি নির্দিষ্ট ব্যতিক্রম নয় [basic.indent] /2.3 যে সরাসরি একটি আরম্ভের অনুমতি দেয় একটি lvalue থেকে পরিবর্তনশীল অনির্দিষ্ট মান (একটি অনির্দিষ্ট মান আরম্ভের ঘটাচ্ছে )।x
unsigned char
unsigned char
এটি কেবলমাত্র অনির্ধারিত আচরণের কারণেই নয়, তবে এমন অন্যান্য ধরণের ক্ষেত্রেও হবে T
যা স্বাক্ষরযুক্ত সরু চরিত্রের ধরন নয় বা std::byte
যেমন int x = x;
। এই বিবেচনাগুলি C ++ 17 এ প্রয়োগ করা হয়েছিল এবং তার আগে, নীচে লিঙ্কিত প্রশ্নগুলিও দেখুন।
যাইহোক, এমনকি unsigned char x = x;
, বর্তমান খসড়ার [বেসিক.লাইফটাইম] / 7 বলে:
একইভাবে, কোনও বস্তুর আজীবন শুরু হওয়ার আগে [...] গ্লাভের বৈশিষ্ট্যগুলি ব্যবহার করে যা এর মানের উপর নির্ভর করে না এটি ভালভাবে সংজ্ঞায়িত। প্রোগ্রামটির নির্ধারিত আচরণ থাকলে যদি:
গ্লুভ্যুটি অবজেক্ট অ্যাক্সেস করতে ব্যবহৃত হয়, বা
[...]
এটি বোঝাচ্ছে যে x
উদাহরণের মানটি কেবল তার জীবদ্দশায় ব্যবহার করা যেতে পারে।
[বেসিক.লাইফটাইম] / 1 বলেছেন:
[...]
টি টাইপের কোনও অবজেক্টের জীবনকাল শুরু হয় যখন:
- [...] এবং
- এর সূচনা (যদি থাকে) সম্পূর্ণ (শূন্য প্রারম্ভিককরণ সহ) ([dcl.init]),
[...]
এইভাবে x
জীবনকাল শুরু হওয়ার পরে শুরু হয় initial তবে উদ্ধৃত উদাহরণে x
মানটির ব্যবহার শুরু হওয়ার পূর্বেই ব্যবহৃত হবে x
। অতএব ব্যবহারের অপরিবর্তিত আচরণ রয়েছে।
আমার বিশ্লেষণটি কি সঠিক এবং যদি এটি হয় তবে এটি ব্যবহার-পূর্ব-প্রারম্ভিককরণের মতো একই ক্ষেত্রে প্রভাবিত করে affect
int x = (x = 1);
কোনটি, যতদূর আমি বলতে পারি, C ++ 17 এবং এর আগেও ভাল সংজ্ঞা দেওয়া হয়েছিল?
মনে রাখবেন যে সি ++ 17 (চূড়ান্ত খসড়া) তে আজীবন শুরু হওয়ার জন্য দ্বিতীয় প্রয়োজনটি ভিন্ন ছিল :
- যদি অবজেক্টটির শূন্য-শুরুর আরম্ভ হয় তবে এর সূচনাটি সম্পূর্ণ,
যেহেতু x
সি ++ 17 এর সংজ্ঞা (তবে বর্তমান খসড়ায় এক নয়) দ্বারা শূন্য সূচনা হতে পারে, তাই উপরে বর্ণিত উদাহরণগুলিতে আরম্ভকারীতে যখন এটি অ্যাক্সেস করা হয় তখন এর জীবনকাল শুরু হয়ে গিয়েছিল এবং তাই উভয় উদাহরণেই কোনও অপরিজ্ঞাত আচরণ ছিল না x
সি ++ 17 এর আজীবন কারণে ।
সি ++ 17 এর পূর্বে শব্দটি আবার আলাদা, তবে একই ফলাফলের সাথে।
প্রশ্নটি অনির্দিষ্ট মান ব্যবহার করার সময় অপরিজ্ঞাত আচরণ সম্পর্কে নয় যা অন্তর্ভুক্ত ছিল যেমন নীচের প্রশ্নগুলি:
int x ^= x;
সিনট্যাক্টিকালি সুগঠিত নয়। আপনি হয় প্রারম্ভকালীন (যেমন int x = x;
এটি ইউবি হলেও) বা একটি এক্সওর অ্যাসাইনমেন্ট এক্সপ্রেশন স্টেটমেন্ট (যেমন x ^= x;
, এটি ইউবি হলেও x
প্রকারের int
, পূর্বনির্ধারিত ছিল এবং আগে নির্ধারিত হয়নি) দিয়ে একটি পরিবর্তনশীল সংজ্ঞা থাকতে পারে। আপনি এই দুটি এক সাথে মিশাতে পারবেন না।