Estoy trabajando en un proyecto con C ++ 11 e intenté seguir el código
#include <atomic>
struct A {
std::atomic_int idx = 1;
};
int main() {
return 0;
}
Me sale el error del compilador
error: use of deleted function 'std::__atomic_base<_IntTp>::__atomic_base(const std::__atomic_base<_IntTp>&) [with _ITp = int]'
std::atomic_int idx = 1;
^
El mismo resultado es con C ++ 14. Cuando cambio a C ++ 17 funciona: wandbox
Revisé cppreference por diferencias:
Pero no hay diferencia documentada entre C ++ 14 y C ++ 17. ¿Por qué funciona con C ++ 17 y no con C ++ 14?
main
(o cualquier función, no es necesario que seamain
), en lugar de un constructor de estructura. Clang da un mensaje de error similar, siendo más explícito que está tratando de usar un constructor de copia eliminado en lugar de un inicializador o un constructor simple: godbolt.org/z/SBGf9w con libc ++Respuestas:
Porque en C ++ 17 hay un RVO garantizado. En C ++ 14, las declaraciones como
Foo x = Foo(args)
yFoo x (args)
técnicamente no son lo mismo, pero están en C ++ 17.Puede leer más sobre esto aquí: https://en.cppreference.com/w/cpp/language/copy_elision
En particular la sección
(since C++17)
:Para que el código C ++ 14 funcione, puede usar
fuente