Estou trabalhando em um projeto com C ++ 11 e tentei seguir o código
#include <atomic>
struct A {
std::atomic_int idx = 1;
};
int main() {
return 0;
}
Eu recebo o erro do 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;
^
O mesmo resultado é com o C ++ 14. Quando eu mudo para o C ++ 17, ele funciona: mudo wandbox
Eu verifiquei cppreference por diferenças:
Mas não há diferença documentada entre C ++ 14 e C ++ 17. Por que funciona com o C ++ 17 e não com o C ++ 14?
main
(ou qualquer função, não precisa sermain
), em vez de um construtor struct. Clang dá uma mensagem de erro semelhante, sendo mais explícito que ele está tentando usar um apagado cópia construtor em vez de initializer ou construtor simples: godbolt.org/z/SBGf9w com libc ++Respostas:
Porque no C ++ 17 há um RVO garantido. No C ++ 14, as instruções gostam
Foo x = Foo(args)
eFoo x (args)
não são tecnicamente iguais, mas estão no C ++ 17.Você pode ler mais sobre isso aqui: https://en.cppreference.com/w/cpp/language/copy_elision
Em particular a seção
(since C++17)
:Para fazer o código C ++ 14 funcionar, você pode usar
fonte