Я хочу использовать std::atomic_int
переменная. В моем коде у меня есть:
#include <atomic>
std::atomic_int stop = 0;
int main()
{
// Do something
}
И это дает мне ошибку компиляции:
use of deleted function 'std::__atomic_base<_IntTp>::__atomic_base(const std::__atomic_base<_IntTp>&) [with _ITp = int]'
std::atomic_int stop = 0;
^
Есть идеи о том, что происходит?
Ваш код пытается создать временный std::atomic_int
на RHS, затем используйте std::atomic_int
конструктор копирования (который является delete
г) инициализировать stop
, вот так:
std::atomic_int stop = std::atomic_int(0);
Это потому что копирования инициализации, как вы выполняете здесь, не совсем эквивалентно другим видам инициализации.
[C++11: 8.5/16]:
Семантика инициализаторов следующая [..]Если инициализатором является (не заключенный в скобки) фигурный список инициализации, объект или ссылка Список инициализируется (8.5.4).
(это позволяет вариант 3, в конце этого ответа)
[..]
Если тип назначения является (возможно, cv-квалифицированным) типом класса:
- Если инициализация прямая инициализация, или же если это копия инициализация где cv-неквалифицированная версия исходного типа является тем же классом, или производным классом класса назначения, рассматриваются конструкторы. Применимые конструкторы перечислены (13.3.1.3), и лучший выбирается через разрешение перегрузки (13.3). Выбранный таким образом конструктор вызывается для инициализации объекта с выражением инициализатора или списком выражений в качестве аргументов. Если конструктор не применяется, или разрешение перегрузки неоднозначно, инициализация некорректна.
(это почти описывает ваш код, но не совсем; ключ здесь в том, что, возможно, вопреки интуиции, std::atomic_int
конструкторы вообще не рассматриваются в вашем случае!)
- В противном случае (т.е. для оставшихся копия инициализация случаи), определяемые пользователем последовательности преобразования, которые могут преобразовывать тип источника в тип назначения или (если используется функция преобразования) в производный класс, перечисляются, как описано в 13.3.1.4, и лучшая из них выбирается с помощью перегрузки. разрешение (13,3). Если преобразование не может быть выполнено или является неоднозначным, инициализация неверна. Выбранная функция вызывается с выражением инициализатора в качестве аргумента; если функция является конструктором, вызов инициализирует временную версию cv-unqualified версии назначения. Временное является prvalue. Результат вызова (который является временным для случая конструктора) затем используется для прямая инициализация, в соответствии с правилами, указанными выше, объект, являющийся копия инициализация. В некоторых случаях реализация позволяет исключить копирование, присущее этому прямая инициализация путем создания промежуточного результата непосредственно в инициализируемом объекте; см. 12.2, 12.8.
(это ваш сценарий; поэтому, хотя копию можно удалить, это все же должно быть возможно)
- [..]
В любом случае, это исправление; использование прямая инициализация или же Список-инициализация:
std::atomic_int stop(0); // option 1
std::atomic_int stop{0}; // option 2
std::atomic_int stop = {0}; // option 3