2015-11-10 6 views
5

जब मैं वापसी प्रकार के रूप में एक unique_ptr उपयोग करते हैं, मैं संकलक त्रुटि C2280 प्राप्त करते हैं:क्या मैं सी ++ एक्टर फ्रेमवर्क में संदेश वापसी प्रकार के रूप में सी ++ 11 स्मार्ट पॉइंटर्स का उपयोग कर सकता हूं?

#include <iostream> 
#include "caf/all.hpp" 

using namespace caf; 
using namespace std; 

class A 
{ 
public: 
    int a; 

    A(int a) 
    { 
     this->a = a; 
    } 
}; 

using a_type = typed_actor<replies_to<int>::with<unique_ptr<A>>>; 

a_type::behavior_type a_behavior(a_type::pointer self) 
{ 
    return 
    { 
     [self](const int& a) -> unique_ptr<A> 
     { 
      return make_unique<A>(5); 
     } 
    }; 
} 

void tester(event_based_actor* self, const a_type& testee) 
{ 
    self->link_to(testee); 
    // will be invoked if we receive an unexpected response message 
    self->on_sync_failure(
     [=] 
     { 
      aout(self) << "AUT (actor under test) failed" << endl; 
      self->quit(exit_reason::user_shutdown); 
     }); 
    self->sync_send(testee, 5).then(
     [=](unique_ptr<A> a) 
     { 
      if(a->a == 5) 
      { 
       aout(self) << "AUT success" << endl; 
      } 

      self->send_exit(testee, exit_reason::user_shutdown); 
     } 
    ); 
} 
:

'caf::detail::tuple_vals<std::unique_ptr<A,std::default_delete<_Ty>>>::tuple_vals(const caf::detail::tuple_vals<std::unique_ptr<_Ty,std::default_delete<_Ty>>> &)': attempting to reference a deleted function include\caf\detail\tuple_vals.hpp 102 

यहाँ कुछ उदाहरण कोड कि इस मुद्दे (सी ++ अभिनेता फ्रेमवर्क उदाहरणों में से एक से संशोधित) दिखाता है

+0

संदेशों में सभी प्रकार नियमित होना चाहिए, यानी, मूल्य अर्थशास्त्र है। रनटाइम केवल प्रतिलिपि बनाता है जब * एक संदेश को अलग करता है, जो किसी संदेश मान पर गैर-कॉन्स्ट पहुंच प्राप्त करने का प्रयास करते समय संदर्भ संख्या के साथ 1. – mavam

+0

@MatthiasVallentin अगर मैं समझता हूं कि आप क्या कह रहे हैं, तो मेरा नीचे का जवाब गलत है (यह संकलन करने के लिए होता है)। यदि आप अपनी टिप्पणी को उत्तर में बढ़ाते हैं, तो मैं खुशी से इसे स्वीकार करूंगा! –

उत्तर

4

सीएएफ की आवश्यकता है कि संदेश में प्रत्येक प्रकार नियमित है। इसका तात्पर्य है कि इसे एक कॉपी कन्स्ट्रक्टर प्रदान करना होगा, जो std::unique_ptr नहीं है। इसलिए संकलक शिकायत करता है।

संदेशों में एक कॉपी-ऑन-राइट कार्यान्वयन है। आप सस्ती रूप से एक संदेश की प्रतिलिपि बना सकते हैं, क्योंकि यह केवल संदर्भ गणना को आंतरिक रूप से बाध्य करता है। किसी भी समय, आप संदेश तत्वों का कॉन्स्ट-एक्सेस कर सकते हैं। कॉपी-ऑन-राइट का "लिखें" भाग केवल तब होता है जब किसी संदेश की संदर्भ संख्या 1 और से अधिक है, तो आप गैर-कॉन्स्ट एक्सेस का अनुरोध करते हैं। उस बिंदु पर रनटाइम एक नया संदेश बनाने के लिए निहित प्रकार की कॉपी कन्स्ट्रक्टर को आमंत्रित करता है।

यदि सीएएफ बिना किसी शर्त के संदर्भ संख्या से स्वतंत्र रूप से इस प्रतिलिपि को निष्पादित करेगा, तो डेटा प्रवाह प्रोग्रामिंग का कुशलता से समर्थन करना संभव नहीं होगा, जहां एक अभिनेता को संदेश प्राप्त होता है, इसकी सामग्री को संशोधित करता है, और आगे के चरण में आगे बढ़ता है।

संदेशों को सूचक कंटेनर के रूप में सोचें: निहित तत्वों को नि: शुल्क स्टोर पर आवंटित किया जाता है। एक संदेश में एक पॉइंटर भंडारण आमतौर पर एक डिजाइन दोष है। डबल-रैपिंग भी आवंटक को अनावश्यक रूप से जोर देती है।

चूंकि आप संदेशों को आसानी से टुकड़ा कर सकते हैं, इसलिए आप एक संदेश बनाने के साथ दूर हो जाते हैं और फिर विभिन्न संदर्भों में निहित मान का उपयोग कर सकते हैं।

2

हां, सी ++ अभिनेता फ्रेमवर्क स्मार्ट पॉइंटर्स को रिटर्न संदेशों में अनुमति देता है, लेकिन unique_ptr के रूप में नहीं।

सी ++ अभिनेता फ्रेमवर्क कार्यान्वयन वर्तमान में संदेश की एक प्रति बनाता है और unique_ptr को संकलित करता है, जिससे संकलक त्रुटि उत्पन्न होती है।

unique_ptr का उपयोग करने के बजाय, shared_ptr का उपयोग करें। प्रश्न के उदाहरण कोड को संशोधित करते समय संदर्भ गणना 2 होगी। मैंने यह सत्यापित करने के लिए कस्टम डिलीट फ़ंक्शन का भी उपयोग किया है कि स्मृति को share_ptr के निर्माण के बावजूद उम्मीद के अनुसार जारी किया गया है।

संबंधित मुद्दे

 संबंधित मुद्दे