【发布时间】:2019-12-27 09:16:03
【问题描述】:
volatile与std::atomic一起使用时完全不需要。
但是,std::atomic_fecth_sub 提供了一个重载函数:
template<class T>
T atomic_fetch_sub(volatile std::atomic<T>* obj,
typename std::atomic<T>::difference_type arg ) noexcept;
我的问题是:
如果volatile对于std::atomic来说完全没有必要,为什么C++标准要为其提供重载函数?
【问题讨论】:
-
那是
std::atomic*,不是std::atomic。 -
对我来说,
volatile std::atomic<T>* obj这个参数意味着:在实践中,volatile std::atomic<T> var;等定义很常见。 -
Volatile 只做一件事。另一个原子。最终将它们结合起来并非不可想象。
-
@DeanSeo 我首先进入了同一个陷阱,但后来才想起它是怎么回事。请注意,
volatile适用于std::atomic,但不适用于std::atomic*。考虑到这一点,恕我直言,这个问题是有道理的。对于指向某物的 volatile 指针,它必须是std::atomic<T> *volatile(对于指向 volatile 的volatile std::atomic<T> *volatile或std::atomic<T> volatile*volatile的 volatile 指针(因为类型说明符和限定符可能有任何顺序))。我必须承认这些 C++ 类型限定符非常棘手...... ;-) -
@Scheff 感谢您的更正!就像
const限定词一样,但我的眼睛不习惯volatile.... 确实很有趣。
标签: c++ c++11 standards atomic volatile