এই প্রশ্নটি সর্বশেষ C ++ 20 খসড়াটিতে P0593 যোগ করার বিষয়টি বোঝায় ।
এখানে আমার উদাহরণ:
#include <cstdlib>
#include <cstdio>
void foo(void *p)
{
if ( std::getchar() == 'i' )
{
*(int *)p = 2;
std::printf("%d\n", *(int *)p);
}
else
{
*(float *)p = 2;
std::printf("%f\n", *(float *)p);
}
}
int main()
{
void *a = std::malloc( sizeof(int) + sizeof(float) );
if ( !a ) return EXIT_FAILURE;
foo(a);
// foo(a); [2]
}
এই কোডটি কি সর্বশেষ খসড়ার অধীনে সমস্ত ইনপুটগুলির জন্য ভাল সংজ্ঞাযুক্ত?
P0593-এ প্রকাশিত যুক্তিটি এটিকে মোটামুটি পরিষ্কার করে দিয়েছে যে [2]
দু'জন ব্যবহারকারীর ইনপুট আইটেমগুলি পৃথক করে থাকলে, কঠোরভাবে আলিয়াস লঙ্ঘনের কারণে কোনও পরিস্থিতি অস্বীকার না করা আচরণের দিকে পরিচালিত করবে। অন্তর্নিহিত অবজেক্টের সৃষ্টি ঠিক একবারে ঘটবে বলে মনে করা হচ্ছে malloc
; এটি অ্যাসাইনমেন্ট স্টেটমেন্ট দ্বারা ট্রিগার হয় না foo
।
প্রোগ্রামটির যে কোনও বাস্তব পরিচালনার জন্য, অন্তর্ভুক্ত অবজেক্টগুলির অনির্দিষ্ট সেটটির একটি সদস্য রয়েছেন যা প্রোগ্রামটিকে সু-সংজ্ঞায়িত করে তুলবে। তবে [ইন্ট্রো.ওজেক্ট] / 10-এ উল্লিখিত অন্তর্নিহিত অবজেক্ট তৈরির পছন্দটি অবশ্যই করা উচিত কিনা তা আমার কাছে স্পষ্ট নয় malloc
; বা সিদ্ধান্তটি "সময় ভ্রমণ" করতে পারে কিনা।
একই প্রোগ্রামটি এমন একটি প্রোগ্রামের জন্য উত্থাপিত হতে পারে যা একটি বাইনারি ব্লবটি বাফারে পড়ে এবং তারপরে কীভাবে এটি অ্যাক্সেস করা যায় তার একটি রানটাইম সিদ্ধান্ত নেয় (উদাহরণস্বরূপ, ডেসারিয়ালাইজেশন; এবং শিরোনামটি জানিয়ে দেয় যে কোনও ফ্লোট বা কোনও আন্তঃসম্পর্ক আসছে কিনা)।