Erreur avec le constructeur de copie/opérateur d'affectation pour une classe qui a std::atomic variable membre
J'ai une classe comme ci-dessous.
#include <atomic>
static const long myValue = 0;
class Sequence
{
public:
Sequence(long initial_value = myValue) : value_(initial_value) {}
private:
std::atomic<long> value_;
};
int main()
{
Sequence firstSequence;
Sequence secondSequence = firstSequence;
return 0;
}
Je suis d'erreur de compilation comme ça,
test.cpp:21:36: error: use of deleted function ‘Sequence::Sequence(const Sequence&)’
test.cpp:5:7: error: ‘Sequence::Sequence(const Sequence&)’ is implicitly deleted because the default definition would be ill-formed:
test.cpp:5:7: error: use of deleted function ‘std::atomic<long int>::atomic(const std::atomic<long int>&)’
Est que le défaut constructeur de copie et l'affectation opertaor ne fonctionnent pas dans ce cas?
PS: je suis en utilisant la version de gcc 4.6.3
OriginalL'auteur polapts | 2012-08-17
Vous devez vous connecter pour publier un commentaire.
Vous ne pouvez pas copier atomics avec une norme constructeur de copie, puisque toutes les charges et les magasins doivent se produire de manière explicite. Vous devrez écrire votre propre constructeur de copie pour
Sequence
qui fait l'initialisation de la formevalue_(rhs.value_.load())
(peut-être avec plus détendue de la mémoire de la commande).Sequence& operator=(const Sequence &other) { value_ = other.value_.load(); return *this; }
Aucune idée de ce que vous avez fait, mais l'approche générale travaux.
Pour plus de détails sur la façon dont vous pouvez réellement écrire un constructeur par copie (avec par défaut
seq_cst
pour le chargement de la source, mais ensuite, en évitant le coût d'une atomique dans le magasin d'objet en cours de construction), voir constructeur de Copie pour les classes atomiques membre. Assurez-vous que c'est vraiment ce que vous voulez à mettre en œuvre; la copie de autour de atomics est généralement contraire à leur objectif partagé de l'état.OriginalL'auteur Kerrek SB
Atomique a supprimé la copie ctor. Donc, copier/déplacer-ctors dans votre classe sont supprimés.
n3337 12.8/11
OriginalL'auteur ForEveR
Car il n'est pas
std::atomic<long int>::atomic(const std::atomic<long int>&)
fonction, il n'existe aucun moyen pour le compilateur pour créer un défaut constructeur de copie pour laSequence
classe. Si vous avez besoin d'un constructeur de copie pour la classe (et vous faire si vous voulezSequence secondSequence = firstSequence;
de travail), alors vous avez besoin d'en écrire un.Ce comportement est requis par la norme:
OriginalL'auteur David Schwartz
Je suppose que le choix de supprimer le constructeur de copie de la norme a été pour deux raisons:
un load/store la paire est nécessaire en général. Est-il possible d'appliquer des que cela sera fait lorsque vous n'avez pas de contrôle sur les appelants de std::atomique?
Que faites-vous si std::atomic<> le type que vous utilisez pour lequel is_lock_free() est faux (c'est à dire. un mutex est nécessaire dans la mise en œuvre pour que la taille de type entier)? Ce que la sémantique de copie que vous utilisez pour le mutex initialisation? Un mutex qui finit implicitement copié doit être ré-initialisé, car il pourrait être malheureusement copié dans un état verrouillé. Je suppose que std::mutex a également supprimé un constructeur de copie pour cette raison, et qui pousse l'exigence en std::atomic trop.
OriginalL'auteur Peeter Joot