volatile,const,volatile const和“ noth”类型之间的转换

问题描述 投票:0回答:1

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?
c++ pointers const implicit-conversion volatile
1个回答
0
投票

您能分配给什么?

您始终可以将易失性值分配给非常量值。您还可以将const和非const值分配给volatile值。您永远不能为const值分配任何内容,因为它们是const。

会发生转换吗?

不-它只是在做作业。

这是为什么?

volatile表示对对象无法优化输出的任何访问。实际上,几乎没有需要或使用volatile的情况。这些情况是:

  • [当您为操作计时时,不希望计算被优化(请使用基准测试库。不要自己动手)
  • [当您执行内存映射IO。在这种情况下,您要确保未优化读写,因此可以使用volatile。

因此,必须将volatile分配给常规对象,反之亦然。但是,与此同时,易失性引用不应隐式转换为常规引用,因为这可能会导致读写操作被优化。

常量呢?

您可以将const内容分配给任何内容,但不能将任何内容分配给const(因为它是const)。

© www.soinside.com 2019 - 2024. All rights reserved.