为什么对volatile int的const引用需要static_cast?

3 c++ volatile

给出以下代码:

struct Foo { 
    volatile int i; 
};

const int& bar = foo.i; 
Run Code Online (Sandbox Code Playgroud)

我明白了:

error: invalid initialization of reference of type 'const int&' from expression of type 'volatile int'
Run Code Online (Sandbox Code Playgroud)

除非我提供static_cast<volatile int>.

Tri*_*dle 7

C++中类型的"Volatility"与"const-ness"几乎完全相同 - 也就是说,一个volatile无法分配给非volatile引用的对象,就像那样

const int i = 3;
int& j = i; // won't work
Run Code Online (Sandbox Code Playgroud)

同样,只能volatile在volatile对象上调用标记的方法:

struct S
{
    void do_something() volatile {}
    void do_something_else() {}
};

volatile S s;
s.do_something(); // fine
s.do_something_else(); // won't work
Run Code Online (Sandbox Code Playgroud)

方法可以通过"波动率"重载,就像它们可以通过常量重载一样.

在C++标准中,这些东西被称为cv-qualifiers,强调它们以完全相同的方式工作.(C99增加了第三个以相同方式工作的,restrict在某些C++编译器中可用作扩展).您可以使用更改cv限定符const_cast<>- static_cast<>不需要更强大的限定符.

编辑:

简而言之,类型可以同时具有两个constvolatile修饰符,总共有四种可能性:

int i;
const int j;
volatile int k;
const volatile int l;
Run Code Online (Sandbox Code Playgroud)