समस्या:
आप कॉपी-प्रारंभ उपयोग नहीं कर सकते, क्योंकि std::atomic_bool
नहीं है कॉपी-constructible:
std::atomic_bool World::mStopEvent = std::atomic_bool(false); // ERROR!
:
std::atomic_bool World::mStopEvent = false; // ERROR!
वास्तव में, इसके बाद के संस्करण के बराबर है
हालांकि, आप प्रत्यक्ष-प्रारंभिक का उपयोग कर सकते हैं zation:
std::atomic_bool World::mStopEvent(false);
अपनी इच्छा पर, आप कोष्ठकों के बजाय ब्रेसिज़ उपयोग करने के लिए चुन सकते हैं:
std::atomic_bool World::mStopEvent{false};
बग:
जबकि कॉपी-आरंभीकरण कोई फर्क नहीं पड़ता गैर कानूनी है कि तुम क्या संकलक चुनें, ऐसा लगता है कि वीसी 11 के साथ भेजे गए मानक लाइब्रेरी के कार्यान्वयन में एक बग है जो आपको प्रत्यक्ष-प्रारंभिक प्रदर्शन करने की अनुमति नहीं देगा।
So how I am supposed to initialize such a variable?
वैकल्पिक हल: करने से पहले की स्थापना की और परमाणु बूलियन ध्वज का मान, लेकिन नहीं - - क्रमशः
एक संभव समाधान के रूप में आप स्थिर गेटर/सेटर रैपर कि की एक जोड़ी प्रदान कर सकते हैं अब बजाय 0 तक पहुँचने का
#include <atomic>
#include <mutex>
struct World
{
static bool is_stop_event_set()
{
std::call_once(mStopEventInitFlag, []() { mStopEvent = false; });
return mStopEvent;
}
static void set_stop_event(bool value)
{
std::call_once(mStopEventInitFlag, [value]() { mStopEvent = value; });
mStopEvent = value;
}
static std::atomic_bool mStopEvent;
static std::once_flag mStopEventInitFlag;
};
std::atomic_bool World::mStopEvent;
std::once_flag World::mStopEventInitFlag;
: यकीन है कि यह कम से कम एक बार और नहीं शुरू कर दिया गया और अधिक एक बार एक धागा सुरक्षित तरीके से वांछित प्रारंभिक मूल्य की तुलना में (आप इस आलसी आरंभीकरण किसी तरह का विचार कर सकते हैं)सीधे, अपने मूल्य is_stop_event_set()
समारोह के माध्यम से पढ़ा जाएगा:
#include <iostream>
int main()
{
std::cout << World::is_stop_event_set(); // Will return false
}
एक ही त्रुटि: 'त्रुटि C2440: 'आरंभ': से परिवर्तित नहीं कर सकते ' bool 'to' std :: atomic_bool ' 1> कोई कन्स्ट्रक्टर स्रोत प्रकार नहीं ले सकता है, या कन्स्ट्रक्टर ओवरलोड रिज़ॉल्यूशन अस्पष्ट था – Sapd