1 सवाल: जब कोरोटीन के लिए पारित अस्थायी नष्ट हो जाते हैं?

पर बनाया गया सवाल Thu, Mar 28, 2019 12:00 AM

मैं कोरटाइन कार्यों के लिए पारित किए गए अस्थायी लोगों के जीवनकाल के बारे में उलझन में हूं। इस उदाहरण पर विचार करें:

cppcoro::task<> UseObject(Object const& object);

cppcoro::task<> CallUseObject() {
    co_await UseObject(Object()); // is this valid?
}

यदि ये शून्य लौटाने वाले कार्य थे, तो 06003509911001001350350 के लिए पारित Object() अर्ध-कोलन में नष्ट हो जाएगा (अर्थात् 06003509911001001350 के पूरा होने के बाद)। हालांकि, मुझे यकीन नहीं है कि अगर कोरटाइन के लिए भी यही लागू होता है। क्या संदर्भ द्वारा एक अस्थायी को नियमित करना सुरक्षित है? यदि अस्थायी बृहदान्त्र नष्ट हो जाता है अगर यह अर्ध उपनिवेश में नहीं है?

इसके अलावा, एक स्वच्छता जांच के रूप में, क्या यह हमेशा लिखना सुरक्षित है:

UseObject

चूंकि UseObject co_await खत्म होने के बाद नष्ट हो गया है?

    
13
  1. मुझे यह कहने के लिए मोहक है कि कथन के अंत में
    cppcoro::task<> CallUseObject() {
        Object stayingalive;
        co_await UseObject(stayingalive);
    }
    
    की मृत्यु हो गई, लेकिन मैं गलत हो सकता हूं। कोरटीन की तरह 'पास पास वैल्यू'
    के लिए एक बढ़िया विकल्प है
    2019-03-28 16: 48: 25Z
  2. यदि फ़ंक्शन कॉरटीन को संदर्भित करता है जो संदर्भ द्वारा पैरामीटर प्राप्त करता है, तो कॉलर फ़ंक्शन कोरटाइन के पूर्ण होने तक, पारित ऑब्जेक्ट के जीवनकाल के लिए ज़िम्मेदार होता है। यह वास्तव में सिंक्रोनस कॉल के लिए एक ही नियम है, लेकिन अब आपको मामले से निपटना चाहिए जब फ़ंक्शन बाहर निकलता है, लेकिन पूरा नहीं होता है, और सभी अस्थायी नष्ट हो जाते हैं। co_await ऑपरेटर मदद नहीं करता है, क्योंकि यह ऑपरेटर रिटर्न वैल्यू पर काम करता है, जो आपको फंक्शन एग्जिट के बाद ही मिलता है।
    2019-04-09 21: 34: 55Z
    1 उत्तर                              1                         

    यह वास्तव में एक noreferrer"> खुला विषय है मुद्दा , । समस्या को उद्धृत करने के लिए:

      

    आशय यह है कि मापदंडों (यदि आवश्यक हो) की प्रतियां /चाल सटीक प्रकार (संदर्भ, आर-संदर्भ, आदि सहित) के संरक्षण से बनाई गई हैं। 11.4.4 [dcl.fct.def.coroutine] /11 में शब्दांकन स्पष्ट रूप से व्यक्त नहीं होता है।

    उसके आधार पर, ऐसा लगेगा कि कोरटाइन फ्रेम अस्थायी के संदर्भ को कैप्चर करेगा।

    चूंकि staying_alive एक अभिव्यक्ति है, अस्थायी पूर्ण अभिव्यक्ति के अंत में नष्ट हो जाना चाहिए जिसमें यह दिखाई देता है। ऊपर दिया गया आपका कोड सुरक्षित है या नहीं, इस बात पर निर्भर करेगा कि इसमें शामिल दो कोरटाइनों का ठोस क्रियान्वयन अस्थायी के संदर्भ में 0600350991100101035062 पर कॉल करके Object() पर सुरक्षित है या नहीं। विशेष रूप से, ध्यान दें कि co_await क्या दोनों पर निर्भर करता है, यह किस प्रकार के कॉउंटाइन के वादे के प्रकार के साथ लागू होता है यह प्रकट होता है। इसके अतिरिक्त, co_await (जिसे हम परिभाषा नहीं जानते), कम से कम। सिद्धांत रूप में, यह दिया गया है ... संदर्भ के साथ अजीब चीजों के सभी प्रकार करते हैं     

    11
    2019-03-29 11: 46: 34Z
    1. मुझे लगता है कि यह आधा मेरे प्रश्न का उत्तर देता है। आप कह रहे हैं कि कोरटाइन फ्रेम में एक संदर्भ होना चाहिए। प्रश्न का अन्य आधा हिस्सा तब होता है जब संदर्भ अमान्य हो जाता है। क्या co_await खत्म होने से पहले ऑब्जेक्ट नष्ट हो जाता है? या अर्ध-उपनिवेश में। कृपया मुझे सही करें अगर मुझे गलत समझा गया।
      2019-03-28 17: 52: 56Z
    2. मैं कहूंगा कि यह वास्तव में अर्धविराम पर होना चाहिए। UseObject एक अभिव्यक्ति है। अस्थायी जो भौतिक हो जाता है जब संदर्भ 0600350991100100135035062 से जुड़ा होता है, पूर्ण अभिव्यक्ति के अंत में नष्ट हो जाएगा।
      2019-03-28 18: 27: 12Z
    3. ठीक है। आपकी टिप्पणी के आधार पर, यह कोड सुरक्षित है क्योंकि कोरटाइन एक अस्थायी के लिए एक संदर्भ संग्रहीत करता है जो कोरआउट के नष्ट होने के बाद नष्ट हो जाता है। यदि आप अपने उत्तर और टिप्पणी को मर्ज करते हैं, तो मैं स्वीकार करूंगाउत्तर।
      2019-03-29 09: 30: 38Z
    4. @ sudorm-rfslash मुझे नहीं लगता कि यह कहा जा सकता है कि यह सामान्य रूप से सुरक्षित है। यह सुरक्षित है या नहीं, इस पर निर्भर करता है कि co_await क्या करेगा। UseObject क्या करता है यह तर्क के प्रकार के साथ-साथ कोरटाइन के वादे के प्रकार पर निर्भर करता है जिसमें यह दिखाई देता है। आपके प्रश्न में दी गई जानकारी के आधार पर कहा जा सकता है कि कोरटाइन कॉल अस्थायी के संदर्भ को कैप्चर करेगा। यह सुरक्षित है या नहीं, यह दो कोरूटाइन के ठोस कार्यान्वयन पर निर्भर करता है ...
      2019-03-29 10: 49: 26Z
    5. मैंने इसे और अधिक स्पष्ट करने के लिए अपना उत्तर अपडेट किया।
      2019-03-29 10: 57: 27Z
      co_await
स्रोत रखा गया यहाँ