कुछ दिन पहले मैं लिखा है कुछ:विज़ुअल सी ++ 2015 क्यों std :: परमाणु असाइनमेंट की अनुमति देता है? निम्नलिखित की तरह
struct A {
std::atomic_bool b = false;
};
इसके कुलपति ++ 2015 संकलक के साथ अद्यतन 3 दृश्य स्टूडियो 2015 में संकलित, कुछ भी गलत ऊपर पॉप।
अब मैं Ubuntu पर जीसीसी (5.4.0) के साथ एक ही बात कंपाइल और त्रुटि मिल गया है:
use of deleted function 'std::atomic::atomic(const std::atomic&)
मैं ideone पर एक ही त्रुटि मिली, सी ++ 14 (यकीन नहीं क्या संकलक करने के लिए सेट संस्करण का उपयोग कर रहा है)।
पाठ्यक्रम जीसीसी के साथ निम्न समस्या तय करने के लिए कोड को बदलने के:
struct A {
std::atomic_bool b { false };
};
मेरे प्रश्न हैं:
1. है कौन सही (सी ++ 11 आज्ञाकारी) यहाँ, कुलपति ++ या जीसीसी है? ऐसा लगता है कि वीसी ++ बूल से कन्स्ट्रक्टर को कॉल करता है, जबकि जीसीसी कॉपी कन्स्ट्रक्टर (हटाए गए) को कॉल करता है।
2. एक वर्ग घोषणा में एक परमाणु आरंभ डिफ़ॉल्ट मान के प्रयोजन के लिए, वर्दी प्रारंभ (ऊपर) सही/पसंदीदा तरीका है? या मैं इसके बजाय ATOMIC_VAR_INIT मैक्रो (ugh!) का उपयोग करना चाहिए?
struct A {
std::atomic_bool b = ATOMIC_VAR_INIT(false);
};
http://stackoverflow.com/questions/21708606/why-does-an-in-place-member-initialization-use-a-copy-constructor-in-c11 देखें। और प्रश्न # 2 के लिए, 'ATOMIC_VAR_INIT' का उपयोग न करें, जो ज्यादातर सी 11 संगतता के लिए है। – interjay