struct S
{
int x;
int y;
};
std::atomic<S> asd{{1, 2}}; // what should this be? This doesn't work
Редактировать: оба {{1, 2}}
а также ({1, 2})
работа в g ++, ни работа в clang. Есть ли обходной путь для лязга?
Это лягушка жук 18097. Вот длинная тема, обсуждающая проблему, которая, кажется, состоит в том, что clang поддерживает только скалярные типы для T
в atomic<T>
, Стандарт C ++ 11 четко гласит (§29.5 / 1), что T
может быть любого тривиально копируемого типа.
Оба использования, показанные в вопросе, должны соответствовать этому конструктору
constexpr atomic(T) noexcept;
Единственный способ обойти это — использовать конструкцию по умолчанию. atomic<S>
а затем использовать atomic::store
инициализировать объект.
std::atomic<S> asd;
asd.store({1,2});
std::atomic<S> asd({1, 2});
std::atomic<S>
имеет конструктор, который принимает значение типа S.
Благодаря этому конструктору список инициализатора {1, 2} неявно преобразуется во временный S.