为什么不能用一个volatile
对象调用非成员函数?为什么一个volatile对象不能调用非易失性成员函数
在const
情况下,是非常有意义的调用非const
成员函数违反对象的常量性并且因此被禁止。但是为什么在volatile
的情况下?
为什么不能用一个volatile
对象调用非成员函数?为什么一个volatile对象不能调用非易失性成员函数
在const
情况下,是非常有意义的调用非const
成员函数违反对象的常量性并且因此被禁止。但是为什么在volatile
的情况下?
在const的情况下,调用非const成员函数违反对象的常量并因此被禁止是有意义的。但为什么在波动的情况下呢?
易失性也是一样。挥发性意味着每次访问对象都是可见的副作用并且不能被消除。如果您在易失性对象上调用非易失性方法,则会违反此属性(因为非易失性方法将对象视为普通对象)。因此,这是不可能的。
volatile
限定符的工作方式与const
的作用相同。要看什么可以做到这一点,看看this Alexandrescu article。 那篇文章也应该给你一些洞见,为什么。
这是2001年的一篇文章,我现在读的是人们建议针对临界区/多线程目的的易失性,并倾向于使用互斥锁。例如:https://www.securecoding.cert.org/confluence/display/seccode/POS03-C.+Do+not+use+volatile+as+a+synchronization+primitive – Nikko
@Nikko:看起来你没有'阅读的内容超过了答案中引用的文章的标题。阅读*完整*文章。 – ybungalobill
从标准:
7.1.5.1。如果试图通过使用非易失性quailified类型的左值引用一个使用volatile-quailified类型定义的对象,则程序行为是未定义的。
我猜你的编译器发布错误以防止未定义的行为。标准说明应该足够合理。
因为你试图违反易失性正确性... –
,我刚刚发现了这个字谜 –