模板函数中的volatile类型推导有什么问题?

aby*_*s.7 5 c++ templates g++ volatile clang++

我有一个模板功能:

template <typename T>
inline void Acquire_Store(volatile T* ptr, T value) {
  // ...
}
Run Code Online (Sandbox Code Playgroud)

当我尝试像这样调用它时:

volatile Node* node;
Acquire_Store(&node, static_cast<Node*>(nullptr));
Run Code Online (Sandbox Code Playgroud)

这两个g ++,clang ++编译器都是这样的:

推导出参数'T'的冲突类型('volatile List :: Node*'vs.'List :: Node*')

调用此模板函数的正确方法是什么?

更新.

现在我不确定它node的类型 - 也许,我应该改成它Node* volatile node;

我希望变量node是易变的,但不是指向的对象.

Joh*_*itb 2

替换和演绎在词法上与宏不同。volatile T*不会成为volatile Node**但是volatile Node* volatile*。第二个 volatile 来自模板。这使得 T 等于volatile Node*第一个参数。

尝试摆脱总是在开头粘着 volatile 的情况,而是根据实际类型将其放在此处。易失性指针的易失性位于星号之后,而不是之前。