क्यों std :: परमाणु निर्माणकर्ता C ++ 14 और C ++ 17 में भिन्न व्यवहार करता है


19

मैं C ++ 11 के साथ एक परियोजना में काम कर रहा हूं और मैंने निम्नलिखित कोड की कोशिश की

#include <atomic>

struct A {
    std::atomic_int idx = 1;

};

int main() {
    return 0;
}

मुझे संकलक त्रुटि मिलती है

error: use of deleted function 'std::__atomic_base<_IntTp>::__atomic_base(const std::__atomic_base<_IntTp>&) [with _ITp = int]'
 std::atomic_int idx = 1;
                       ^

यही परिणाम C ++ 14 के साथ है। जब मैं C ++ 17 पर काम करता हूं तो यह काम करता है: वैंडबॉक्स

मैंने मतभेदों के लिए जाँच की:

लेकिन C ++ 14 और C ++ 17 के बीच कोई अंतर नहीं है। यह C ++ 17 के साथ क्यों काम करता है और C ++ 14 के साथ नहीं?


आप क्या संकलक / मानक पुस्तकालय / मंच का उपयोग करते हैं?
विक्टर गूबिन

@VictorGubin मैंने लिनक्स (वैंडबॉक्स) पर क्लैंग और जीसीसी के साथ प्रयास किया। मैंने विभिन्न संस्करणों की कोशिश की।
थॉमस सब्लिक

1
आप mainकिसी mainस्ट्रक्चर कंस्ट्रक्टर के बजाय MCVE को सिर्फ एक लोकल (या किसी भी फंक्शन, इसके लिए कोई ज़रूरत नहीं ) के लिए सरल बना सकते हैं । क्लैंग एक समान त्रुटि संदेश देता है, और अधिक स्पष्ट होने के नाते कि यह इनिशियलाइज़र या सादे कंस्ट्रक्टर के बजाय एक हटाए गए कॉपी कंस्ट्रक्टर का उपयोग करने की कोशिश कर रहा है : Godbolt.org/z/SBGf9w libc ++ के साथ
पीटर

@PeterCordes मुझे यकीन नहीं था कि यह त्रुटि वर्ग आरंभीकरण से संबंधित है।
बजे थॉमस सबलिक

3
एक सरल न्यूनतम प्रतिलिपि प्रस्तुत करने योग्य उदाहरण के लिए एक ही त्रुटि संदेश प्राप्त करना साबित करता है कि यह नहीं है। जब तक मैंने कोशिश नहीं की मुझे यकीन नहीं हुआ।
पीटर कॉर्ड्स

जवाबों:


29

क्योंकि C ++ 17 में गारंटीकृत RVO है। C ++ में 14 स्टेटमेंट जैसे हैं Foo x = Foo(args)और Foo x (args)तकनीकी रूप से समान नहीं हैं, लेकिन वे C ++ 17 में हैं।

struct Foo {
    Foo() = default;
    Foo(const Foo&) = delete;
};

int main() {
    // Works in C++17 and C++20, fails in C++14 and before
    Foo foo = Foo(); 
}

आप इसके बारे में और अधिक यहाँ पढ़ सकते हैं: https://en.cppreference.com/w/cpp/language/copy_elision

विशेष रूप से अनुभाग (since C++17):

टी एक्स = टी (टी (एफ ())); // केवल एक्स को इनिशियलाइज़ करने के लिए T के डिफॉल्ट कंस्ट्रक्टर को केवल एक कॉल

C ++ 14 कोड काम करने के लिए, आप उपयोग कर सकते हैं

std::atomic_int idx { 1 };
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.