По существу, это означает, что конкретизация std::atomic<некоторый-встроенный-тип>
допустима, как и конкретизация std::atomic<некоторая-простая-структура>
, но такие вещи, как std::atomic
, недопустимы.
Помимо основного шаблона, имеются специализации для встроенных целочисленных типов и указателей, которые предоставляют дополнительные операции, например x++
.
Экземпляры std::atomic
не удовлетворяют требованиям концепций CopyConstructible
и CopyAssignable
, потому что такие операции невозможно выполнить атомарно.
template
struct atomic {
atomic() noexcept = default;
constexpr atomic(BaseType) noexcept;
BaseType operator=(BaseType) volatile noexcept;
BaseType operator=(BaseType) noexcept;
atomic(const atomic&) = delete;
atomic& operator=(const atomic&) = delete;
atomic& operator=(const atomic&) volatile = delete;
bool is_lock_free() const volatile noexcept;
bool is_lock_free() const noexcept;
void store(BaseType, memory_order = memory_order_seq_cst)
volatile noexcept;
void store(BaseType, memory_order = memory_order_seq_cst)
noexcept;
BaseType load(memory_order = memory_order_seq_cst)
const volatile noexcept;
BaseType load(memory_order = memory_order_seq_cst)
const noexcept;
BaseType exchange(BaseType, memory_order = memory_order_seq_cst)
volatile noexcept;
BaseType exchange(BaseType, memory_order = memory_order_seq_cst)
noexcept;
bool compare_exchange_strong(
BaseType & old_value, BaseType new_value,
memory_order order = memory_order_seq_cst) volatile noexcept;
bool compare_exchange_strong(
BaseType & old_value, BaseType new_value,
memory_order order = memory_order_seq_cst) noexcept;
bool compare_exchange_strong(
BaseType & old_value, BaseType new_value,
memory_order success_order,
memory_order failure_order) volatile noexcept;
bool compare_exchange_strong(
BaseType & old_value, BaseType new_value,
memory_order success_order,
memory_order failure_order) noexcept;
bool compare_exchange_weak(
BaseType & old_value, BaseType new_value,
memory_order order = memory_order_seq_cst)
volatile noexcept;
bool compare_exchange_weak(
BaseType & old_value, BaseType new_value,
memory_order order = memory_order_seq_cst) noexcept;
bool compare_exchange_weak(
BaseType & old_value, BaseType new_value,
memory_order success_order,
memory_order failure_order) volatile noexcept;
bool compare_exchange_weak(
BaseType & old_value, BaseType new_value,
memory_order success_order,
memory_order failure_order) noexcept;
operator BaseType() const volatile noexcept;
operator BaseType() const noexcept;
};
template
bool atomic_is_lock_free(
volatile const atomic
template
bool atomic_is_lock_free(const atomic
noexcept;
template
void atomic_init(volatile atomic
template