C ++(11)标准对volatile,const,volatile const和“都不”类型之间的转换怎么说?我知道将const类型分配给非const非易失性类型是明确定义并可以接受的,但是以下类型(其中T是某种类型)之间的转换又如何呢?
// Non-pointer-to-T
T
T volatile
T const
T volatile const
// Pointer-to-T
T*
T volatile*
T const*
T volatile const*
// Volatile pointer
T* volatile
T volatile* volatile
T const* volatile
T volatile const* volatile
// Const pointer
T* const
T volatile* const
T const* const
T volatile const* const
// Volatile const pointer
T* volatile const
T volatile* volatile const
T const* volatile const
T volatile const* volatile const
作为一个简单的示例,请考虑以下代码:
T volatile a;
T const b;
a = b; // implicit conversion from const to volatile; okay?
template<typename T>
void fcn(T& t)
{
t = b; // implicit conversion from const to non-const, which I assume is okay
}
fcn(a); // implicit conversion from volatile to non-volatile; okay?
您能分配给什么?
您始终可以将易失性值分配给非常量值。您还可以将const和非const值分配给volatile值。您永远不能为const值分配任何内容,因为它们是const。
会发生转换吗?
不-它只是在做作业。
这是为什么?
volatile
表示对对象无法优化输出的任何访问。实际上,几乎没有需要或使用volatile
的情况。这些情况是:
因此,必须将volatile
分配给常规对象,反之亦然。但是,与此同时,易失性引用不应隐式转换为常规引用,因为这可能会导致读写操作被优化。
常量呢?
您可以将const内容分配给任何内容,但不能将任何内容分配给const(因为它是const)。