你能帮我理解为什么编译器给我这些错误信息吗? 我相信挥发性物体的成员也是不稳定的。 我是从这里来的 但是,如果我们有一个结构,
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;
*p
是someStruct volatile* volatile
类型的左值 (*p)->d
是lThreadInfo* volatile
类型的左值。 所以在(*p)->d
的类型中,你lThreadInfo
和*
之间的lThreadInfo
。 [expr.ref] / 4:
如果
E2
是非静态数据成员,并且E1
的类型是“ cq1 vq1X
”,并且E2
的类型是“ cq2 vq2T
”,则表达式指定由第一表达式指定的对象的指定成员。 如果E1
是一个左值,则E1.E2
是一个左值; 如果E1
是一个xvalue,那么E1.E2
是一个xvalue; 否则,这是一个惊喜。 让记号vq12代表vq1和vq2的“联合”; 也就是说,如果vq1或vq2是volatile
,则vq12是volatile
。 类似地,让符号cq12代表cq1和cq2的“联合”; 也就是说,如果cq1或cq2是const
,则cq12是const
。 如果E2
被声明为可变成员,则E1.E2
的类型是“ vq12T
”。 如果E2
没有被声明为可变成员,那么E1.E2
的类型是“ cq12 vq12T
” 。
vq1是volatile
, vq2是空的。 因此vq12是volatile
。 因此表达式的类型是volatile T
,它是lThreadInfo* volatile
。