C++ 为什么对volatile int的常量引用需要静态转换?
给定以下代码:C++ 为什么对volatile int的常量引用需要静态转换?,c++,volatile,C++,Volatile,给定以下代码: struct Foo { volatile int i; }; const int& bar = foo.i; 我得到: error: invalid initialization of reference of type 'const int&' from expression of type 'volatile int' >除非我提供C++的代码> < /> > “C++中的类型”的“波动”与“const”完全相同,也就是说,“ Val
struct Foo {
volatile int i;
};
const int& bar = foo.i;
我得到:
error: invalid initialization of reference of type 'const int&' from expression of type 'volatile int'
<> >除非我提供C++的代码> < /> > “C++中的类型”的“波动”与“const”完全相同,也就是说,“<代码> Value”的对象不能被分配给非<代码> Value引用,就像
const int i = 3;
int& j = i; // won't work
类似地,只有标记为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
方法可以被“波动性”重载,就像它们可以被常量重载一样
<>在C++标准化中,这些事物被称为CV限定符,强调它们以完全相同的方式工作。(C99添加了第三个以相同方式工作的代码,<代码>限制< /代码>,作为一些C++编译器的扩展。您可以使用const\u cast
更改cv限定符——不需要更强大的static\u cast
编辑:
为了明确起见,类型可以同时具有const
和volatile
修饰符,总共有四种可能:
int i;
const int j;
volatile int k;
const volatile int l;
与
const
一样,volatile
对象只能由volatile
引用引用。否则,编译器无法知道通过引用对对象的访问需要是易变的
volatile const int& bar = foo.i;
^^^^^^^^
除非我提供了一个静态\u cast
通过添加强制转换来消除编译器错误很少是个好主意。这并没有给你一个对foo.i
的引用,而是一个单独的副本
如果您正在做一些非常奇怪的事情,需要对易失性对象进行非易失性引用,则需要const\u cast
删除限定符:
const int& weird = const_cast<int&>(foo.i);
const int&wird=const_cast(foo.i);
你能解释一下为什么你认为它不需要它吗?@K-ballo试图编译不是我的代码,我遇到了其他具有静态强制转换的代码,它可以工作。volatile
在这方面几乎与const
完全一样。该标准在任何地方都有术语cv限定,甚至只是cv。您实际上要求能够使用名称bar
访问volatile int
foo.i
,其中< <代码> bar >代码>不考虑<代码> fo。i < /代码>代码>易失性/代码>:这是有风险的,这意味着对<代码> Bar <代码>的更新可能不会影响<代码> fo的内存。使用显式强制转换是你说“这是有意的,让我来做”的选择。这是相关的:我真的希望你知道什么是volatile
的意思,以及为什么去掉它很少是个好主意。