Почему {} работает, а () не работает здесь при инициализации атомарного объекта?

Рассмотрим код:

#include <atomic>

struct stru {
  int a{};
  int b{};
};

int main() {
  // Doesn't work: std::atomic<stru> as({});
  std::atomic<stru> as{{}};
}

Сообщение об ошибке, созданное для прямой инициализации, похоже на:

prog.cc: In function 'int main()':
prog.cc:9:26: error: call of overloaded 'atomic(<brace-enclosed initializer list>)' is ambiguous
   std::atomic<stru> as({});
                          ^
In file included from prog.cc:1:0:
/opt/wandbox/gcc-7.2.0/include/c++/7.2.0/atomic:200:17: note: candidate: constexpr std::atomic<_Tp>::atomic(_Tp) [with _Tp = stru]
       constexpr atomic(_Tp __i) noexcept : _M_i(__i) { }
                 ^~~~~~
/opt/wandbox/gcc-7.2.0/include/c++/7.2.0/atomic:196:7: note: candidate: std::atomic<_Tp>::atomic(const std::atomic<_Tp>&) [with _Tp = stru] <deleted>
       atomic(const atomic&) = delete;
   ^~~~~~

Я думаю, что эти две формы не должны отличаться в данном конкретном случае. Почему это происходит?


person Lingxi    schedule 20.03.2018    source источник
comment
Также актуально: stackoverflow.com/questions/42586836/   -  person StoryTeller - Unslander Monica    schedule 20.03.2018
comment
@DavisHerring - Спасибо, что связались со мной. Я не хотел забивать его на днях, так как не был уверен на 100%.   -  person StoryTeller - Unslander Monica    schedule 22.03.2018