PROBLEM:
Nie można używać kopiowania inicjalizację, ponieważ std::atomic_bool
nie jest kopia constructible:
std::atomic_bool World::mStopEvent = false; // ERROR!
W rzeczywistości, powyższe jest równoważne:
std::atomic_bool World::mStopEvent = std::atomic_bool(false); // ERROR!
Można jednak użyć bezpośrednio-inicjowania zacji:
std::atomic_bool World::mStopEvent(false);
Na Państwa życzenie, można wybrać zamiast wykorzystywać szelki z nawiasami:
std::atomic_bool World::mStopEvent{false};
BUG:
Podczas kopiowania inicjalizacji jest nielegalne bez względu na to, co kompilator wybierz, wydaje się, że implementacja Standardowej Biblioteki dostarczonej z VC11 ma błąd, który nie pozwoli ci na bezpośrednią inicjalizację.
So how I am supposed to initialize such a variable?
Obejście:
W celu obejścia tego problemu można podać parę statycznych owijarki że getter/setter - odpowiednio - ustawienie i powrócić wartość atomowej flagi wartości logicznej, ale nie przed dokonaniem upewnić się, że została zainicjowana przynajmniej raz i nie więcej niż raz do żądanej wartości początkowej w sposób bezpieczny wątku (można rozważyć to jakiś leniwej inicjalizacji):
#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;
teraz zamiast dostępie mStopEvent
bezpośrednio, jego wartość powinna być odczytywana przez is_stop_event_set()
funkcję:
#include <iostream>
int main()
{
std::cout << World::is_stop_event_set(); // Will return false
}
sam błąd: 'error C2440: 'inicjowanie': nie można przekonwertować z ' bool 'na' std :: atomic_bool ' 1> Żaden konstruktor nie może przyjąć typu źródłowego lub rozdzielczość przeciążania konstruktora była niejednoznaczna' – Sapd