Pracuję w projekcie z C ++ 11 i próbowałem śledzić kod
#include <atomic>
struct A {
std::atomic_int idx = 1;
};
int main() {
return 0;
}
Otrzymuję błąd kompilatora
error: use of deleted function 'std::__atomic_base<_IntTp>::__atomic_base(const std::__atomic_base<_IntTp>&) [with _ITp = int]'
std::atomic_int idx = 1;
^
Ten sam wynik jest w przypadku C ++ 14. Po przejściu na C ++ 17 działa: wandbox
Sprawdziłem preferencje pod kątem różnic:
Ale nie ma udokumentowanej różnicy między C ++ 14 a C ++ 17. Dlaczego działa z C ++ 17, a nie z C ++ 14?
main
(lub dowolnej funkcji, nie ma takiej potrzebymain
), zamiast do konstruktora struct. Clang podaje podobny komunikat o błędzie, mówiąc bardziej wyraźnie, że próbuje użyć skasowanego konstruktora kopii zamiast inicjatora lub zwykłego konstruktora: godbolt.org/z/SBGf9w z libc ++Odpowiedzi:
Ponieważ w C ++ 17 istnieje gwarantowane RVO. W C ++ 14 stwierdzenia jak
Foo x = Foo(args)
iFoo x (args)
technicznie nie są takie same, ale są w C ++ 17.Możesz przeczytać więcej na ten temat tutaj: https://en.cppreference.com/w/cpp/language/copy_elision
W szczególności sekcja
(since C++17)
:Aby kod C ++ 14 działał, możesz użyć
źródło