সি ++ ২০ সাল থেকে বরাদ্দকৃত স্টোরেজে পয়েন্টার গাণিতিকটি কি অনুমোদিত?


10

C ++ 20 স্ট্যান্ডার্ডে বলা হয় যে অ্যারের প্রকারগুলি অন্তর্নিহিত আজীবন টাইপ

এর অর্থ কি এই নয় যে একটি অন্তর্নিহিত আজীবন টাইপের একটি অ্যারে সুস্পষ্টভাবে তৈরি করা যেতে পারে? এই জাতীয় অ্যারের অন্তর্নিহিত সৃষ্টি অ্যারের উপাদানগুলির সৃষ্টি করার কারণ হবে না?

এই ক্ষেত্রে বিবেচনা করুন:

//implicit creation of an array of std::string 
//but not the std::string elements:
void * ptr = operator new(sizeof (std::string) * 10);
//use launder to get a "pointer to object" (which object?)
std::string * sptr = std::launder(static_cast<std::string*>(ptr));
//pointer arithmetic on not created array elements well defined?
new (sptr+1) std::string("second element");

এই কোডটি কি C ++ 20 এর পরে আর ইউবি নয়?


এই উপায় কি আরও ভাল হয়?

//implicit creation of an array of std::string 
//but not the std::string elements:
void * ptr = operator new(sizeof (std::string) * 10);
//use launder to get a "pointer to the array of 10 std::string" 
std::string (* sptr)[10] = std::launder(static_cast<std::string(*)[10]>(ptr));
//pointer arithmetic on an array is well defined
new (*sptr+1) std::string("second element");

1
আমি সবেমাত্র (খসড়া) সি ++ ২০ স্ট্যান্ডার্ডের মাধ্যমে অনুসন্ধান করেছি এবং অ্যারেগুলিকে "অন্তর্নিহিত আজীবন টাইপ" (এবং, হ্যাঁ, আমি তারতম্যের জন্য অনুসন্ধান করেছি) হিসাবে বর্ণনা করে এমন কিছুই পাইনি। দয়া করে আপনার দাবির আরও বিশদ বিবরণ প্রদান করুন (উদাহরণস্বরূপ স্ট্যান্ডার্ডে বিভাগ এবং ধারা)। উত্সটি সন্ধান না করে আপনার প্রশ্নের উত্তর দেওয়া শক্ত, তবে কোনও প্রাসঙ্গিক প্রসঙ্গটি ছেড়ে দিন।
পিটার

1
@ পিটার: eel.is/c++ftft /basic.tyype#9 , শেষ বাক্য
গেজা

আমি পিডিএফটি খোলা ছিলাম-std.org/jtc1/sc22/wg21/docs/papers/2020/n4849.pdf ( স্পষ্টতই সর্বশেষতম খসড়া খসড়া) এবং এটিতে সেই বাক্যটিও নেই। দেখে মনে হচ্ছে আপনার "অন্তর্নিহিত-জীবনকাল" এর অর্থও খুঁজে পাওয়া দরকার। আমি সন্দেহ করি যে আপনার লিঙ্কটি কিছু "সম্পাদনা চলছে" এটি এমনকি প্রকাশিত কার্য খসড়াতে তৈরি করে নি।
পিটার

1
@ পিটার পরিবর্তনগুলি হল P0593 এর সাম্প্রতিক প্রাগ সভা থেকে মান হিসাবে একীভূত হওয়ার ফলাফল । তারা এখনও ফলাফলের খসড়া প্রকাশ করেনি, তবে আপনি এই প্রতিশ্রুতিতে মার্জ হওয়া শব্দটি দেখতে পাচ্ছেন ।
আখরোট

উত্তর:


3

এর অর্থ কি এই নয় যে একটি অন্তর্নিহিত আজীবন টাইপের একটি অ্যারে স্পষ্টভাবে তৈরি করা যেতে পারে?

হ্যাঁ.

এই জাতীয় অ্যারের অন্তর্নিহিত সৃষ্টি অ্যারের উপাদানগুলির সৃষ্টি করার কারণ হবে না?

হ্যাঁ.

এটি std::vectorসাধারণ সি ++ এ বাস্তবায়িত করে তোলে ।


আপনি এটিও নিশ্চিত করতে পারেন যে std::launder(static_cast<std::string*>(ptr))অ্যারের প্রথম উপাদানটিতে কোনও পয়েন্টার ফিরে আসে না কারণ এটি তার জীবদ্দশায় নয়, তবে std::launder(static_cast<std::string(*)[10]>(ptr))অ্যারেতে একটি পয়েন্টার ফেরত দেয়, কারণ অ্যারেটি তার জীবদ্দশায়?
অলিভ

এটা আমার কাছে সঠিক বলে মনে হচ্ছে
টিসি

@ অলিভ এবং আমি মনে করি std::launderআসলে এটির প্রয়োজন নেই, কারণ eel.is/c++traft/intro.object#11 গ্যারান্টি দেয় যা ptrইতিমধ্যে অ্যারেটিকে নির্দেশ করবে?
আখরোট

@ ওয়ালনাট, আমি এটি মিস করেছি। একটি সুতরাং static_castকরতে std::string (*) [10]যথেষ্ট হওয়া উচিত! TX।
অলিভ

@ অলিভ তবে আমি অনুমান করি যে প্রশ্নটি তখন আপনার হয়ে ওঠে না এমন প্রথম উদাহরণটি std::launderসঠিকভাবে সংজ্ঞায়িত হবে কিনা । এখানে std::stringনির্দেশ করার মতো কোনও বিষয় নেই , তবে ptrঅ্যারেতে নির্দেশ করতে পারে, যাতে স্থির castালাই মানটি অপরিবর্তিত রেখে দেয় এবং sptrপাশাপাশি অ্যারেতেও নির্দেশ করে। সঙ্গে std::launderএটা কারণ কেবল UB হয় std::launderএর প্রয়োজনীয়তা।
আখরোট
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.