2012-08-17 12 views
14

है मेरे पास एक वर्ग है।एक वर्ग के लिए कॉपी कन्स्ट्रक्टर/असाइनमेंट ऑपरेटर के साथ त्रुटि जिसमें std :: atomic सदस्य चर

#include <atomic> 

static const long myValue = 0; 

class Sequence 
{ 

public: 

    Sequence(long initial_value = myValue) : value_(initial_value) {} 


private: 

    std::atomic<long> value_; 
}; 

int main() 
{ 
     Sequence firstSequence; 
     Sequence secondSequence = firstSequence; 
     return 0; 
} 

मैं इस तरह संकलन त्रुटि हो रही है,

test.cpp:21:36: error: use of deleted function ‘Sequence::Sequence(const Sequence&)’ 
test.cpp:5:7: error: ‘Sequence::Sequence(const Sequence&)’ is implicitly deleted because the default definition would be ill-formed: 
test.cpp:5:7: error: use of deleted function ‘std::atomic<long int>::atomic(const std::atomic<long int>&)’ 

कि डिफ़ॉल्ट प्रतिलिपि निर्माता और असाइनमेंट opertaor तरह के मामले में काम नहीं करते है?

पुनश्च: क्योंकि कोई std::atomic<long int>::atomic(const std::atomic<long int>&) समारोह मैं जीसीसी संस्करण 4.6.3

उत्तर

14

आप मानक प्रतिलिपि निर्माता के साथ परमाणुओं की प्रतिलिपि नहीं बना सकते हैं, क्योंकि सभी भार और स्टोर स्पष्ट रूप से होने चाहिए। आपको Sequence के लिए अपनी खुद की प्रतिलिपि निर्माता लिखना होगा जो value_(rhs.value_.load()) (संभवतः अधिक आराम से स्मृति आदेश के साथ) के प्रारंभिकरण को प्रारंभ करता है।

+0

क्या आप एक संकलित कोड उदाहरण को संपादित और जोड़ सकते हैं? मैं इस समस्या को हल करने में असफल रहा, मैंने कोशिश की है: 'अनुक्रम और ऑपरेटर = (कॉन्स अनुक्रम और अन्य) {value_ = other.value_.load(); वापसी * ​​यह; } ' –

+0

@VictorLamoine: कोई विचार नहीं कि आपने क्या किया, लेकिन सामान्य दृष्टिकोण [काम करता है] (https://wandbox.org/permlink/ZsHPDqhrIiybq7qf)। –

+1

इस बारे में अधिक जानकारी के लिए कि आप वास्तव में एक प्रति-निर्माता (स्रोत को लोड करने के लिए डिफ़ॉल्ट 'seq_cst' के साथ कैसे लिख सकते हैं, लेकिन फिर निर्माणाधीन वस्तु में एक परमाणु स्टोर की लागत से परहेज करते हैं), देखें [परमाणु सदस्य के साथ कक्षाओं के लिए कन्स्ट्रक्टर कॉपी करें ] (https://stackoverflow.com/questions/19961043/copy-constructor-for-classes-with-atomic-member/46045691#46045691)। सुनिश्चित करें कि यह वास्तव में आप कार्यान्वित करना चाहते हैं; परमाणुओं के आसपास प्रतिलिपि आमतौर पर साझा राज्य के रूप में उनके उद्देश्य के विपरीत होती है। –

5

उपयोग कर रहा हूँ, वहाँ संकलक Sequence वर्ग के लिए एक डिफ़ॉल्ट प्रतिलिपि निर्माता बनाने के लिए के लिए कोई रास्ता नहीं है। अगर आपको उस वर्ग के लिए एक प्रतिलिपि बनाने की आवश्यकता है (और यदि आप Sequence secondSequence = firstSequence; काम करने के लिए चाहते हैं तो आप ऐसा करते हैं) तो आपको एक लिखना होगा।

यह व्यवहार मानक के लिए आवश्यक है:

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

6

परमाणु ने कॉपी-सीटीर हटा दिया है। तो आपकी कक्षा में प्रतिलिपि/चाल-सीटीर्स हटा दिए गए हैं।

n3337 12.8/11

एक स्पष्ट रूप से घोषित प्रतिलिपि/चालक कन्स्ट्रक्टर अपनी कक्षा का एक इनलाइन सार्वजनिक सदस्य है। के रूप में नष्ट एक वर्ग एक्स के लिए एक डिफॉल्ट की कॉपी/ चाल निर्माता परिभाषित किया गया है (8.4.3) यदि एक्स है:

- वर्ग प्रकार एम (या उसके सरणी) की प्रतिलिपि नहीं बनाई जा सकती है की एक गैर स्थिर डेटा सदस्य/ले जाया गया क्योंकि अधिभार संकल्प (13.3), के रूप में एम के लिए इसी निर्माता के लिए आवेदन किया, एक अस्पष्टता या एक समारोह नष्ट कर दिया या डिफॉल्ट निर्माता से दुर्गम है कि में परिणाम है,

0

मुझे लगता है कि चुनाव से हटाने के लिए लगता है कि चाहते हैं मानक में कॉपी कन्स्ट्रक्टर दो कारणों से था:

  • सामान्य रूप से लोड/स्टोर जोड़ी की आवश्यकता होती है। क्या यह लागू करने का कोई तरीका है कि यह तब किया जाएगा जब आप std :: परमाणु के कॉलर्स को नियंत्रित नहीं करते?

  • यदि आप std :: atomic <> टाइप करते हैं, तो आप क्या करते हैं, जिसका उपयोग is_lock_free() गलत है (यानी उस आकार पूर्णांक प्रकार के कार्यान्वयन में एक म्यूटेक्स आवश्यक है)? आप mutex प्रारंभिकरण के लिए किस प्रतिलिपि अर्थशास्त्र का उपयोग करते हैं? एक म्यूटेक्स जो पूरी तरह से कॉपी की गई है, को फिर से शुरू करने की जरूरत है क्योंकि इसे लॉक किए गए राज्य में अनियमित रूप से कॉपी किया जा सकता है। मुझे लगता है कि std :: mutex के कारण एक हटाए गए प्रतिलिपि निर्माता भी हैं, और यह आवश्यकता को std :: atomic में भी धक्का देता है।

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