Ich arbeite in einem Projekt mit C ++ 11 und habe versucht, folgenden Code zu verwenden
#include <atomic>
struct A {
std::atomic_int idx = 1;
};
int main() {
return 0;
}
Ich bekomme den Compilerfehler
error: use of deleted function 'std::__atomic_base<_IntTp>::__atomic_base(const std::__atomic_base<_IntTp>&) [with _ITp = int]'
std::atomic_int idx = 1;
^
Das gleiche Ergebnis ist mit C ++ 14. Wenn ich zu C ++ 17 wechsle, funktioniert es: wandbox
Ich habe cppreference auf Unterschiede überprüft:
Es ist jedoch kein Unterschied zwischen C ++ 14 und C ++ 17 dokumentiert. Warum funktioniert es mit C ++ 17 und nicht mit C ++ 14?
main
(oder eine beliebige Funktion, die nicht erforderlich ist) vereinfachenmain
. Clang gibt eine ähnliche Fehlermeldung aus, da expliziter versucht wird, einen gelöschten Kopierkonstruktor anstelle des Initialisierers oder einfachen Konstruktors zu verwenden: godbolt.org/z/SBGf9w mit libc ++Antworten:
Denn in C ++ 17 gibt es eine garantierte RVO. In C ++ 14 mögen
Foo x = Foo(args)
undFoo x (args)
sind Anweisungen technisch nicht gleich, aber sie sind in C ++ 17.Weitere Informationen hierzu finden Sie hier: https://en.cppreference.com/w/cpp/language/copy_elision
Insbesondere der Abschnitt
(since C++17)
:Damit C ++ 14-Code funktioniert, können Sie verwenden
quelle