& quot; Использование удаленной функции & quot; ошибка с std :: atomic_int

Я хочу использовать 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;
^

Есть идеи о том, что происходит?

19

Решение

Ваш код пытается создать временный 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
23

Другие решения


По вопросам рекламы [email protected]