Je travaille dans un projet avec C ++ 11 et j'ai essayé de suivre le code
#include <atomic>
struct A {
std::atomic_int idx = 1;
};
int main() {
return 0;
}
J'obtiens l'erreur du compilateur
error: use of deleted function 'std::__atomic_base<_IntTp>::__atomic_base(const std::__atomic_base<_IntTp>&) [with _ITp = int]'
std::atomic_int idx = 1;
^
Le même résultat est avec C ++ 14. Quand je passe en C ++ 17 ça marche: wandbox
J'ai vérifié cppreference pour les différences:
Mais il n'y a aucune différence documentée entre C ++ 14 et C ++ 17. Pourquoi ça marche avec C ++ 17 et pas avec C ++ 14?
main
(ou n'importe quelle fonction, pas besoin qu'il soitmain
), au lieu d'un constructeur struct. Clang donne un message d'erreur similaire, étant plus explicite qu'il essaie d'utiliser un constructeur de copie supprimé au lieu d'un initialiseur ou d'un constructeur simple: godbolt.org/z/SBGf9w avec libc ++Réponses:
Parce qu'en C ++ 17 il y a un RVO garanti. En C ++ 14, les instructions comme
Foo x = Foo(args)
etFoo x (args)
techniquement ne sont pas identiques, mais elles sont en C ++ 17.Vous pouvez en savoir plus à ce sujet ici: https://en.cppreference.com/w/cpp/language/copy_elision
En particulier la section
(since C++17)
:Pour faire fonctionner le code C ++ 14, vous pouvez utiliser
la source