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

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

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&) было просто неправильно.

2 ответа

Решение

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

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

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

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

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

std::atomic<int> x{1};
atomic<int> x = 1; // not an assignment.

является

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

в то время как

atomic<int> x;
x = 1; // assignment
Другие вопросы по тегам