C ++代码中易变的相关错误

你能帮我理解为什么编译器给我这些错误信息吗? 我相信挥发性物体的成员也是不稳定的。 我是从这里来的 但是,如果我们有一个结构,

struct someStruct { int d; }; 

而'p'是这样定义的:

 volatile someStruct* volatile* p; 

&(*p)->d具有以下types'int * volatile *'而不是'volatile int * volatile *'。 以下是我正在处理的实际代码。


行(标记为错误1和2)是编译器引发错误消息的地方:

 #include <vector> #include <windows.h> using namespace std; struct ThreadInfo { bool bWaiting = false; bool bWorking = false; }; struct lThreadInfo { ThreadInfo d; lThreadInfo *pNextList = nullptr; } volatile *volatile lThreads(nullptr); thread_local ThreadInfo* currentThr(nullptr); void CreateThread_(void (*pFunc)(ThreadInfo*)) { volatile lThreadInfo* volatile* p = &lThreads; for(; *p; p = &(*p)->pNextList); //**//error 1!** *p = new lThreadInfo; CreateThread( nullptr, // default security attributes 0, // use default stack size (long unsigned int (*)(void*))pFunc, // thread function name &(*p)->d, // argument to thread function **//error 2!** 0, // use default creation flags nullptr); } 

错误消息如下:

 error 1: invalid conversion from 'lThreadInfo* volatile*' to 'volatile lThreadInfo* volatile*' [-fpermissive] error 2: invalid conversion from 'volatile void*' to 'LPVOID {aka void*}' [-fpermissive] 

注意 :我知道volatile与线程安全无关,所以不要麻烦告诉我。 注1 :我在windows上使用mingw64编译器。

通过volatile访问路径, pNextList也是volatile 。 但是pNextList指针指点人类型与以前具有相同的cv资格。

也就是说

 struct A { lThreadInfo* p; }; someStruct volatile* volatile* p; 
  • *psomeStruct volatile* volatile类型的左值
  • (*p)->dlThreadInfo* volatile类型的左值。

所以在(*p)->d的类型中,你lThreadInfo*之间的lThreadInfo 。 [expr.ref] / 4:

如果E2是非静态数据成员,并且E1的类型是“ cq1 vq1 X ”,并且E2的类型是“ cq2 vq2 T ”,则表达式指定由第一表达式指定的对象的指定成员。 如果E1是一个左值,则E1.E2是一个左值; 如果E1是一个xvalue,那么E1.E2是一个xvalue; 否则,这是一个惊喜。 让记号vq12代表vq1vq2的“联合”; 也就是说,如果vq1vq2volatile ,则vq12volatile 类似地,让符号cq12代表cq1cq2的“联合”; 也就是说,如果cq1cq2const ,则cq12const 。 如果E2被声明为可变成员,则E1.E2的类型是“ vq12 T ”。 如果E2没有被声明为可变成员,那么E1.E2的类型是“ cq12 vq12 T

vq1volatilevq2是空的。 因此vq12volatile 。 因此表达式的类型是volatile T ,它是lThreadInfo* volatile