Равномерная инициализация атомной структуры?

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. Есть ли обходной путь для лязга?

8

Решение

Это лягушка жук 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});
5

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

std::atomic<S> asd({1, 2});

std::atomic<S> имеет конструктор, который принимает значение типа S.
Благодаря этому конструктору список инициализатора {1, 2} неявно преобразуется во временный S.

0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector