যার জীবনকাল শেষ হয়ে গেছে এমন কোনও সামগ্রীর সদস্য ফাংশন কর্টিন পুনরায় চালু করা কি ইউবি?


9

এই প্রশ্নটি এই মন্তব্যটি থেকে উদ্ভূত: সি ++ 20 কর্টিনগুলির জন্য ল্যাম্বডা আজীবন ব্যাখ্যা

এই উদাহরণ সম্পর্কে:

auto foo() -> folly::coro::Task<int> {
    auto task = []() -> folly::coro::Task<int> {
        co_return 1;
    }();
    return task;
}

সুতরাং প্রশ্নটি হচ্ছে যে ফেরত দেওয়া করউটিন কার্যকর করার fooফলে ইউবি হবে।

সদস্যের ফাংশনটিকে "কল করা" (বস্তুর আজীবন শেষ হওয়ার পরে) হ'ল ইউবি: http://eel.is/c++draft/basic. Life# 6.2

... যে পয়েন্টারটি সেই স্টোরেজ অবস্থানের ঠিকানা প্রতিনিধিত্ব করে যেখানে বস্তুটি হবে বা ছিল তা কেবল সীমিত উপায়ে ব্যবহার করা যেতে পারে। [...] প্রোগ্রামটির আচরণ অপরিবর্তিত থাকলে যদি:

[...]

- পয়েন্টারটি কোনও অ স্থিতিশীল ডেটা সদস্য অ্যাক্সেস করতে বা অবজেক্টের অ-স্থিতিশীল সদস্য ফাংশনটি কল করতে ব্যবহৃত হয় , বা

তবে এই উদাহরণে:

  • ()যখন ল্যামডা এর জীবদ্দশায় এখনও বৈধ ল্যামডা এর অপারেটর বলা হয়
  • এটি স্থগিত করা হয়,
  • তারপর ল্যাম্বদা ধ্বংস হয়ে যায়,
  • এবং তারপরে সদস্য ফাংশন (অপারেটর ()) এর কিছু সময় পরে আবার শুরু হয়।

এই পুনঃসূচনাটি কি অপরিবর্তিত আচরণ হিসাবে বিবেচিত হয়?


2
হতে পারে নীচের উত্তরটি প্রাসঙ্গিক স্ট্যাকওভারফ্লো.com/ a/ 60495359/12345656 এটি বেশ আলাদা বলে মনে হয় তবে এটি কোনও সদস্য ফাংশন সম্পর্কে যা কার্যকর করার সময় thisপয়েন্টারটি অবৈধ হয়। মন্তব্যগুলিতে আলোচনাটিও বিবেচনা করুন।
n314159

উত্তর:


2

[dcl.fct.def.coroutine] পি 3 :

প্রতিশ্রুতি টাইপ একটি coroutine হয় std::coroutine_traits<R, P1, ..., Pn>::promise_type, যেখানে Rফাংশনের রিটার্ন টাইপ, এবং P1 ... Pnফাংশন পরামিতি ধরনের ক্রম হয় অন্তর্নিহিত বস্তুর পরামিতি ধরণ পূর্বে (12.4.1) যদি coroutine একটি অ-স্ট্যাটিক হয় সদস্য ফাংশন।

অন্তর্নিহিত অবজেক্টের প্যারামিটারটি আপনার উদাহরণে একটি স্থির রেফারেন্স, এবং সেইজন্য ক্লোজার অবজেক্টটি ধ্বংস হয়ে যাওয়ার পরে যখন এক্সিকিউশনটি পুনরায় শুরু করা হয় তখন সেই রেফারেন্সটি ঝুঁকবে।

যাইহোক, সদস্য ফাংশন কার্যকর করার সময় অবজেক্টগুলি নষ্ট হওয়ার নোটে, এটি আসলে প্রতি জরিমানা, এবং মান ব্যতীত অন্য কোনও [মৌলিক] এ বোঝায় না :

কোনও বস্তুর জীবদ্দশায় শুরু হওয়ার আগে কিন্তু বস্তুটি যে স্টোরেজটি দখল করবে তার পরে বরাদ্দ দেওয়া হয়েছে বা কোনও অবজেক্টের জীবদ্দশায় শেষ হওয়ার পরে এবং যে স্টোরেজটি দখল করে রাখা বস্তুটি পুনরায় ব্যবহার বা প্রকাশের আগে, কোনও পয়েন্টার যে ঠিকানাটির প্রতিনিধিত্ব করে স্টোরেজ অবস্থান যেখানে অবজেক্টটি হবে বা ছিল তা কেবল সীমিত উপায়ে ব্যবহার করা যেতে পারে। [...]

void B::mutate() {
  new (this) D2;    // reuses storage --- ends the lifetime of *this
  f();              // undefined behavior
  ... = this;       // OK, this points to valid memory
}

(এনবি: উপরের ইউবিটি অন্তর্নিহিত কারণ this করা হয়নি এবং এখনও অন্তর্নিহিত বস্তুর প্যারামিটারকে বোঝায়))

সুতরাং আপনার উদাহরণটি যথাযথভাবে সংজ্ঞায়িত, ধারণাটি অনুসারে শর্তসাপেক্ষ বলে মনে হয় যে মৃত্যুদন্ড পুনরুদ্ধার একটি মূল আহবান হিসাবে একই নিয়মের অধীনে আসে না। নোট করুন যে ক্লোজার অবজেক্টের রেফারেন্সটি ঝুঁকির মধ্যে পড়তে পারে তবে সাসপেনশন এবং পুনঃস্থাপনের মধ্যে কোনওভাবেই এটি অ্যাক্সেস করা যায় না।


আপনি কি শেষে "পুনরায় শুরু এবং সমাপ্তি" বলতে চান?
ডেভিস হ্যারিং

@ ডেভিস হেরিং না, আমি নির্দিষ্ট করে "বাইরের" সময়সীমার মধ্যে নির্দিষ্ট করেছিলাম যেখানে রেফারেন্সটি কোনও নতুন রেফারেন্সের জন্য নির্ধারিত হতে পারে ইত্যাদি যা প্রকৃত অবজেক্টের প্রয়োজন হবে তা পরিষ্কার নয়। রেফারেন্সটি কোনও গোপন উপায়ে অ্যাক্সেস না করা এই বিষয়টি ইউবি না হওয়ার জন্য গুরুত্বপূর্ণ
কলম্বো

তবে পুনরায় শুরু হওয়া পর্যন্ত ঝুঁকির রেফারেন্সটি একা রেখে যাওয়া যথেষ্ট নয়; আপনাকে এটিকে একা রেখে যেতে হবে ( যেমন ল্যাম্বডা দেহে) চিরকালের জন্য its তার সারাজীবন, যা সম্পূর্ণ হওয়া পর্যন্ত। সুতরাং এটি "স্থগিতাদেশ এবং সমাপ্তি" হওয়া উচিত।
ডেভিস হেরিং

@ ডেভিস হেরিং আমি সেই ব্যবধানটি বিশেষভাবে উল্লেখ করেছি, কারণ আমাদের উদাহরণে আমরা জানি অন্যটিকে নিরাপদ থাকতে।
Columbo

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