Mam klasę o zmiennej składowej atomowej:C++ 11: Napisz konstruktora ruchu z atomowym członkiem <bool>?
struct Foo
{
std::atomic<bool> bar;
/* ... lots of other stuff, not relevant here ... */
Foo()
: bar(false)
{}
/* Trivial implementation fails in gcc 4.7 with:
* error: use of deleted function ‘std::atomic<bool>::atomic(const td::atomic<bool>&)’
*/
Foo(Foo&& other)
: bar(other.bar)
{}
};
Foo f;
Foo f2(std::move(f)); // use the move
Jak powinna wyglądać przenieść konstruktora?
Gcc 4.7 nie lubi żadnego z moich prób (takich jak dodawanie std::move()
wokół other.bar
) i netto jest zaskakująco cichy tutaj ...
Dzięki, 'bar (other.bar.load())' jest właściwym rozwiązaniem, które jest kompilacji teraz! – Chris
_So, Twój kod wygląda na to, że powinien się skompilować. Nie, 'atomowy' ma konstruktora skasowanego kopiowania, a rozdzielczość przeciążenia stwierdza, że nie jest to konstruktor 'atomowy (T)'. Odlewanie lub ładunek są niezbędne. –
@ Jonathan Masz rację, myślałem, że kompilator przejdzie do następnego możliwego konstruktora '(T)', jeśli wie, że konstruktor kopiowania został usunięty i istnieje 'operator T'. Czy powodem tego jest to, że konstruktorem atomowym dla '(T)' jest 'constexpr' sprawiający, że zachowuje się on podobnie do' jawnych' konstruktorów, że niejawne konwersje muszą być jawne (lub w tym przypadku 'constexpr')? –