Я работаю в проекте с C ++ 11, и я попробовал следующий код
#include <atomic>
struct A {
std::atomic_int idx = 1;
};
int main() {
return 0;
}
Я получаю ошибку компилятора
error: use of deleted function 'std::__atomic_base<_IntTp>::__atomic_base(const std::__atomic_base<_IntTp>&) [with _ITp = int]'
std::atomic_int idx = 1;
^
Тот же результат с C ++ 14. Когда я переключаюсь на C ++ 17, это работает: wandbox
Я проверил cppreference на различия:
Но нет никакой разницы, документированной между C ++ 14 и C ++ 17. Почему он работает с C ++ 17, а не с C ++ 14?
main
(или любой другой функции, которая не требуетсяmain
) вместо конструктора структуры. Clang выдает похожее сообщение об ошибке, будучи более явным, что он пытается использовать конструктор удаленной копии вместо инициализатора или простого конструктора: godbolt.org/z/SBGf9w с libc ++Ответы:
Потому что в C ++ 17 есть гарантированный RVO. В C ++ 14 операторы похожи
Foo x = Foo(args)
иFoo x (args)
технически не совпадают, но они есть в C ++ 17.Вы можете прочитать больше об этом здесь: https://en.cppreference.com/w/cpp/language/copy_elision
В частности раздел
(since C++17)
:Чтобы заставить работать код C ++ 14, вы можете использовать
источник