классовая инициализация атомарного

Почему в этом примере

struct Foo {
atomic<int> x = 1;
};

компилятор (gcc 4.8) пытается использовать atomic& operator=(const atomic&) который удаляется (отсюда пример не скомпилируется), а здесь

struct Bar {
Bar() { x = 1; }
atomic<int> x;
};

это вызывает int operator=(int) как и ожидалось?

PS: я это уже знаю

struct Xoo {
atomic<int> x{1};
};

хорошо (во всяком случае, лучший способ для инициации x), но мне все еще интересно, почему Foo сломано.

PS: я неправильно прочитал ошибку компилятора (и забыл включить ее в вопрос). Это на самом деле говорит:

 error: use of deleted function ‘std::atomic<int>::atomic(const                                                                          std::atomic<int>&)’
std::atomic<int> x = 1;
^
[...] error: declared here
atomic(const atomic&) = delete;
^

поэтому мое вышеупомянутое утверждение «… пытается использовать atomic& operator=(const atomic&) было просто неправильно.

3

Решение

std::atomic<int> x = 1; является копирования инициализации, и в основном делает это:

std::atomic<int> x{std::atomic<int>{1}};

Ваш компилятор на самом деле не жалуется operator=, но вместо этого о конструкторе копирования.

(Как вы указали, позже operator= звонок работает просто отлично.)

Выполните нормальную инициализацию:

std::atomic<int> x{1};
9

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

atomic<int> x = 1; // not an assignment.

является

atomic<int> x{atomic<int>{1}};

в то время как

atomic<int> x;
x = 1; // assignment
4

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