Spec-Zone.ru › C++

std::atomic_ref<T>::operator+=,-=

Предоставляются только если T является арифметическим типом, отличным от cv bool, или типом указателя на объект
value_type operator+=( difference_type arg ) const noexcept;
(1) (constexpr с C++26)
value_type operator-=( difference_type arg ) const noexcept;
(2) (constexpr с C++26)

Атомарно заменяет текущее значение, на которое ссылается *ptr, результатом вычисления с использованием предыдущего значения и arg. Эти операции являются операциями чтения-модификации-записи.

1) operator+= выполняет атомарное сложение. Эквивалентно return fetch_add(arg) + arg;.
2) operator-= выполняет атомарное вычитание. Эквивалентно return fetch_sub(arg) - arg;.
  • Для знаковых целочисленных типов арифметика определяется с использованием дополнительного кода. Неопределённых результатов не бывает.
  • Для типов с плавающей точкой действующая среда вычислений с плавающей точкой может отличаться от среды вычислений с плавающей точкой вызывающего потока. Операция не обязана соответствовать соответствующим свойствам std::numeric_limits, но рекомендуется их соблюдать. Если результат не представим в данном типе, результат не специфицирован, однако в остальном операция не приводит к неопределённому поведению.
  • Для типов указателей результат может быть неопределённым адресом, однако в остальном операция не приводит к неопределённому поведению.
    • Если std::remove_pointer_t<T> не является полным типом объекта, программа некорректна.

Эти перегрузки участвуют в разрешении перегрузки только если std::is_const_v<T> равно false.

Параметры

arg - аргумент арифметической операции

Возвращаемое значение

Полученное значение (то есть результат применения соответствующего бинарного оператора к значению, на которое ссылается *ptr непосредственно перед выполнением соответствующей функции-члена).

Примечания

В отличие от большинства составных операторов присваивания, составные операторы присваивания для atomic_ref возвращают копию сохранённого значения, а не ссылку на arg.

Пример

Отчёты об ошибках

Следующие отчёты об ошибках, изменяющие поведение, были ретроактивно применены к ранее опубликованным стандартам C++.

DR Применяется к Поведение согласно опубликованной версии Корректное поведение
LWG 3508
(P3323R1)
C++20 составные операторы присваивания не имели смысла для constT ограничены так, чтобы принимать только неконстантные T

См. также

fetch_add
атомарно прибавляет аргумент к значению, хранящемуся в объекте, на который указывает ссылка, и получает значение, хранившееся ранее
(открытая функция-член)
fetch_sub
атомарно вычитает аргумент из значения, хранящегося в объекте, на который указывает ссылка, и получает значение, хранившееся ранее
(открытая функция-член)
operator++operator++(int)operator--operator--(int)
атомарно увеличивает или уменьшает значение объекта, на который указывает ссылка, на единицу
(открытая функция-член)
operator&=operator|=operator^=
атомарно выполняет побитовые операции И, ИЛИ и исключающее ИЛИ с указанным значением
(открытая функция-член)

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/atomic/atomic_ref/operator_arith2

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API