Ho una classe con una variabile membro atomica:C++ 11: costruttore di movimento di scrittura con membro atomico <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
Come dovrebbe essere spostare aspetto costruttore come?
Gcc 4.7 non piace nessuno dei miei tentativi (come l'aggiunta di std::move()
intorno al other.bar
) e la rete è sorprendentemente tranquillo qui ...
Grazie, la barra (other.bar.load()) '' è la soluzione giusta che è la compilazione ora! – Chris
_So, il tuo codice sembra come dovrebbe essere compilato. No, 'atomic' ha un costruttore di copie cancellato e la risoluzione di overload non trova il costruttore 'atomic (T)'. Il cast o il carico è necessario. –
@JonathanAvviamente hai ragione, pensavo che il compilatore avrebbe continuato con il prossimo costruttore possibile '(T)' quando sa che il costruttore di copie è stato cancellato e c'è un 'operatore T'. Il motivo è che il costruttore atomico di '(T)' è 'constexpr' e si comporta in modo simile ai costruttori' espliciti' in quanto le conversioni implicite devono essere esplicite (o in questo caso 'constexpr')? –