2011-11-08 41 views
5

为什么不能用一个volatile对象调用非成员函数?为什么一个volatile对象不能调用非易失性成员函数

const情况下,是非常有意义的调用非const成员函数违反对象的常量性并且因此被禁止。但是为什么volatile的情况下?

+1

因为你试图违反易失性正确性... –

+2

,我刚刚发现了这个字谜 –

回答

4

在const的情况下,调用非const成员函数违反对象的常量并因此被禁止是有意义的。但为什么在波动的情况下呢?

易失性也是一样。挥发性意味着每次访问对象都是可见的副作用并且不能被消除。如果您在易失性对象上调用非易失性方法,则会违反此属性(因为非易失性方法将对象视为普通对象)。因此,这是不可能的。

2

volatile限定符的工作方式与const的作用相同。要看什么可以做到这一点,看看this Alexandrescu article。 那篇文章也应该给你一些洞见,为什么

+0

这是2001年的一篇文章,我现在读的是人们建议针对临界区/多线程目的的易失性,并倾向于使用互斥锁。例如:https://www.securecoding.cert.org/confluence/display/seccode/POS03-C.+Do+not+use+volatile+as+a+synchronization+primitive – Nikko

+0

@Nikko:看起来你没有'阅读的内容超过了答案中引用的文章的标题。阅读*完整*文章。 – ybungalobill

4

从标准:

7.1.5.1。如果试图通过使用非易失性quailified类型的左值引用一个使用volatile-quailified类型定义的对象,则程序行为是未定义的。

我猜你的编译器发布错误以防止未定义的行为。标准说明应该足够合理。

+0

我认为这个问题是“为什么” –

+0

很好的发现规格。 – iammilind

+0

@ TomalakGeret'kal,因为标准是这样说的:) –

相关问题