Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/126.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++ const_cast是如何工作的?_C++_C++11 - Fatal编程技术网

C++ const_cast是如何工作的?

C++ const_cast是如何工作的?,c++,c++11,C++,C++11,我已经知道const\u cast的作用了。然而,我想知道它是如何工作的。当编译器看到一个const\u cast时,它具体做什么 回想一下。由于const_cast(…)所做的一切都是从类型*中删除const-ness,因此它除了告诉编译器您知道自己在做什么之外,基本上什么都不做。常量是一个编译时概念,因此在编译器内部也会抛弃它 *它还可以添加/删除常量或强制将其视为易变的,但所有这些都遵循相同的基本方法。Aconst\u cast不编译为任何指令;它只返回移除cv限定符后的相同值。这是一种打

我已经知道const\u cast的作用了。然而,我想知道它是如何工作的。当编译器看到一个
const\u cast
时,它具体做什么

回想一下。由于
const_cast(…)
所做的一切都是从类型*中删除
const
-ness,因此它除了告诉编译器您知道自己在做什么之外,基本上什么都不做。常量是一个编译时概念,因此在编译器内部也会抛弃它


*它还可以添加/删除常量或强制将其视为易变的,但所有这些都遵循相同的基本方法。

A
const\u cast
不编译为任何指令;它只返回移除cv限定符后的相同值。这是一种打破通常阻止修改
const
对象(或通过
const
glvalue修改非
const
对象)的类型系统的方法。

当然,这取决于编译器

但是,一般来说过于简单,编译器将每个作用域(函数块、嵌套块等)内的代码转换为变量/对象的一些内部表示形式以及对它们的操作序列。对象可以命名(例如与代码中声明的变量相对应)或未命名(例如临时对象)。使用该表示法,它将跟踪每个对象的cv限定(无论是标记为
const
volatile
,还是它们的组合),并将测试对象上操作的有效性(例如,在初始化后拒绝分配给
const int

当遇到
const\u cast
时,编译器将使用不同的
const
限定注册一个条目,并相应地进行后续检查,直到包含范围结束


所有这些都发生在编译过程中。在发出的目标代码中通常没有证据表明这一点,特别是如果编译器识别出两个指针引用同一个对象,只是cv限定不同。

请记住,您可以随时检查实际的编译器,例如,它类似于
重新解释\u cast
。不编译到任何实际的指令,这只是一种手动禁用C++的一些类型安全机制的方法。