Vor ein paar Tagen habe ich etwas wie das folgende geschrieben:
%Vor%In Visual Studio 2015 Update 3 mit seinem VC ++ 2015-Compiler wurde nichts falsch gemacht Jetzt habe ich dasselbe mit GCC (5.4.0) auf Ubuntu neu kompiliert und habe den Fehler:
Verwendung der gelöschten Funktion 'std :: atomic :: atomic (const std :: atomic & amp;)
Ich habe den gleichen Fehler auf ideone , auf C ++ 14 gesetzt (nicht sicher, welche Compiler-Version er verwendet).
Natürlich änderte der folgende Code das Problem mit gcc:
%Vor% Meine Fragen sind:
1. Wer hat Recht (C ++ 11 konform) hier, VC ++ oder GCC? Es scheint, dass VC ++ den Konstruktor von bool aufruft, während GCC den Kopierkonstruktor aufruft (gelöscht).
2. Für den Zweck der Vorgabewert Initialisierung eines Atom in einer Klassendeklaration, ist die einheitliche Initialisierung (oben) die richtige / bevorzugte Weise? Oder sollte ich stattdessen ATOMIC_VAR_INIT Makro (ugh!) Verwenden?
VC ist hier falsch. Pre-C ++ 17 semantisch bedeutet der Code X x = y
einen Aufruf von X tmp(y)
, gefolgt von einem Aufruf von X(tmp)
- d. H. Es gibt einen semantisch aufgerufenen Kopierkonstruktor.
Während alle Compiler, die ich kenne, den Zwischenruf eliminieren (Standard erlaubt das), ist das Programm immer noch schlecht ausgebildet. Sieht aus wie VC Semantik nicht korrekt erzwingt.
In C ++ 17 würde sich die Semantik dieses Aufrufs ändern und würde nur einen einzigen Initialisierungskonstruktoraufruf erfordern, wodurch der Code wohlgeformt wird.
Tags und Links c++ gcc c++11 stdatomic visual-c++-2015