Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么对volatile int的常量引用需要静态转换?_C++_Volatile - Fatal编程技术网

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
的意思,以及为什么去掉它很少是个好主意。