Kilka dni temu pisałem coś jak poniżej:Dlaczego Visual C++ 2015 pozwala na std :: atomowe przypisanie?
struct A {
std::atomic_bool b = false;
};
Zestawione w Visual Studio 2015 Update 3 z VC++ 2015 kompilatora, nic złego pojawiło się.
Teraz mam zrekompilowane samo z GCC (5.4.0) na Ubuntu i mam błąd:
use of deleted function 'std::atomic::atomic(const std::atomic&)
Mam ten sam błąd na ideone, zestaw do C++ 14 (nie wiem, co kompilator wersja, której używa).
Oczywiście zmiany kodu na następujący problem został rozwiązany z gcc:
struct A {
std::atomic_bool b { false };
};
moje pytania są następujące: 1.
kto ma rację (C++ 11 zgodny) tutaj, VC++ lub GCC? Wydaje się, że VC++ wywołuje konstruktor z bool, podczas gdy GCC wywołuje konstruktor kopiowania (usunięty).
2. Dla celów wartości domyślnej inicjalizacji atomowej w deklaracji klasy, czy jednolita inicjalizacja (powyżej) jest prawidłową/preferowaną metodą? Czy zamiast tego powinienem użyć makro ATOMIC_VAR_INIT (ugh!)?
struct A {
std::atomic_bool b = ATOMIC_VAR_INIT(false);
};
Zobacz http://stackoverflow.com/questions/21708606/why-does-an-in-place-member-initialization-use-a-kopia-constructor-in-c11. I na pytanie 2, nie używaj "ATOMIC_VAR_INIT", to głównie dla kompatybilności C11. – interjay