“L'utilisation de supprimé la fonction” erreur std::atomic_int
Je veux utiliser un std::atomic_int
variable. Dans mon code, j'ai:
#include <atomic>
std::atomic_int stop = 0;
int main()
{
//Do something
}
Et cela me donne une erreur de compilation:
use of deleted function 'std::__atomic_base<_IntTp>::__atomic_base(const std::__atomic_base<_IntTp>&) [with _ITp = int]'
std::atomic_int stop = 0;
^
Une idée sur ce qu'il se passe?
Sûrement booster/thread.php n'est pas pertinent ici? Le problème persiste lorsque vous retirez l'en-tête?
Oui, il n'a rien à voir avec boost vraiment...ne sais pas pourquoi j'ai inclus! Le problème reste le même après la suppression de l'en-tête.
Repro dans GCC 4.9
la copie de l'initialisation nécessite une copie accessible-constructeur
Bah oui j'ai toujours oublier cette règle. Standardese maintenant disponibles ci-dessous.
Oui, il n'a rien à voir avec boost vraiment...ne sais pas pourquoi j'ai inclus! Le problème reste le même après la suppression de l'en-tête.
Repro dans GCC 4.9
la copie de l'initialisation nécessite une copie accessible-constructeur
Bah oui j'ai toujours oublier cette règle. Standardese maintenant disponibles ci-dessous.
OriginalL'auteur Karnivaurus | 2014-12-05
Vous devez vous connecter pour publier un commentaire.
Votre code est de tenter de construire un temporaire
std::atomic_int
sur les RHS, puis utilisez lestd::atomic_int
constructeur de copie (ce qui estdelete
d) à l'initialisation d'stop
, comme suit:C'est parce que copier-initialisation, que vous êtes ici, n'est pas tout à fait équivalent à d'autres types d'initialisation.
(ce qui permet pour l'option 3, à la fin de cette réponse)
(presque décrit votre code, mais pas tout à fait; la clé ici est que, peut-être contraire à l'intuition,
std::atomic_int
's les constructeurs ne sont pas pris en considération dans votre cas!)(c'est votre scénario; ainsi, bien que la copie peut être gommés, il doit encore être possible)
Voici la solution, de toute façon; utilisation direct-initialisation ou liste d'initialisation:
Il n'a rien à voir avec un quelconque constructeur par défaut. Vous êtes en fournissant des arguments.
N'est-ce pas le cas pour presque n'importe quel type?
T a = x;
crée un temporaireT
construit à partir dex
, et initialise ensuitea
de que temporaire. Copie élision peut éliminer le temporaire, mais le constructeur de copie doit néanmoins être disponible.Ah, oui, j'ai trouvé la formulation. Standardese entrant!
Et de l'option 3:
std::atomic_int stop = {0};
. C'est la copie de l'initialisation, mais la copie d'initialisation à l'aide d'un arc-boutée-init-liste réalise la copie de la liste d'initialisation, ce qui n'implique pas temporaires (dans ce cas).OriginalL'auteur Lightness Races in Orbit