2017-02-17 9 views
8

कुछ दिन पहले मैं लिखा है कुछ:विज़ुअल सी ++ 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); 
}; 
+1

http://stackoverflow.com/questions/21708606/why-does-an-in-place-member-initialization-use-a-copy-constructor-in-c11 देखें। और प्रश्न # 2 के लिए, 'ATOMIC_VAR_INIT' का उपयोग न करें, जो ज्यादातर सी 11 संगतता के लिए है। – interjay

उत्तर

3

वीसी यहां गलत है। प्री-सी ++ 17 अर्थात् कोड X x = y का मतलब है X tmp(y) पर कॉल के बाद X(tmp) पर कॉल करें - यानी, एक कॉपी-कन्स्ट्रक्टर अर्थात् कहा जाता है।

जबकि सभी compilers मुझे पता है (मानक है कि अनुमति देता है) मध्यवर्ती कॉल को खत्म करता है, तो, कार्यक्रम अभी भी बीमार बना है। ऐसा लगता है कि वीसी अर्थशास्त्र को सही ढंग से लागू नहीं करता है।

सी ++ 17 में, इस कॉल का अर्थशास्त्री बदल जाएगा, और केवल एक ही प्रारंभिक कन्स्ट्रक्टर कॉल की आवश्यकता होगी, इस प्रकार कोड अच्छी तरह से गठित हो जाएगा।

+0

मुझे आश्चर्य है कि वीसी ++ 2015 पहले से ही सी ++ 17 ड्राफ्ट से कुछ लागू करता है। – roalz

+0

@roalz जो अभी भी एक C++ 11 प्रोग्राम में गलत होगा। – Surt

+1

@ सर्ट निश्चित, और जहां तक ​​मुझे पता है, वीसी ++ 2015 अपडेट 3 में होना चाहिए/std: C++ 14 डिफ़ॉल्ट रूप से स्विच (मेरे मामले में): https://blogs.msdn.microsoft.com/vcblog/2016/06/07/मानक संस्करण-स्विच-इन-द-संकलक /। तो यह निश्चित रूप से एक वीसी ++ शिकायत मुद्दा लगता है। – roalz

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

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