В соответствии с этим префикс std::atomic<T>::operator++
возвращает T
, поэтому этот код только увеличивает v
один раз:
template<class T> void addTwo(std::atomic<T>& v) {
++(++v);
}
Кроме того, std::atomic<T>::operator=
явно возвращает T
, поэтому этот код разыгрывает неверный указатель, который указывал на временный T
:
template<class T>
void setOneThenTwo(std::atomic<T>& v) {
auto ptr = &(v = 1);
*ptr = 2;
}
Я, безусловно, не предлагаю, чтобы эти образцы кода были хорошей практикой, однако мне очень удивительно, что std::atomic
ломает их. Я всегда ожидаю, что operator=
и префикс operator++
вернут ссылку на *this
.
Вопрос: Является ли cppreference прав о типах возврата здесь, и если да, есть ли веская причина, что std::atomic
ведет себя иначе, чем встроенные типы в этом отношении?