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