const_cast如何工作?

时间:2016-09-03 21:45:49

标签: c++ c++11

我已经知道const_cast做了什么。但是我想知道它是如何完成这项工作的。编译器看到const_cast时到底做了什么?

3 个答案:

答案 0 :(得分:6)

回想一下const_cast is safe only when the actual variable has been declared non-const。由于所有const_cast<T>(...)都在从类型 * 中删除const - 所以除了告诉编译器你知道自己在做什么之外,它基本上什么也没做。 Const-ness是一个编译时的概念,因此将其丢弃也会在编译器内部发生。

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

答案 1 :(得分:4)

const_cast无法编译任何指令;它只是返回相同的值,删除了cv-qualifier。这是打破类型系统的一种方法,通常会阻止通过const glvalue修改const对象(或非const对象)。

答案 2 :(得分:2)

当然,这取决于编译器。

但是,一般而言,过于简单化,编译器将每个范围内的代码(功能块,嵌套块等)转换为变量/对象的一些内部表示,以及对它们的操作序列。可以命名对象(例如,对应于代码中声明的变量)或未命名的对象(例如临时对象)。使用该表示,它将跟踪每个对象的cv限定(无论是标记为 ... this.text = ""; var viewModel = this; this.tinymceOptions = { setup: function (editor) { editor.on('keyup', function (e) { console.log(editor.getContent()); console.log(viewModel.text); }); }, ... }; const还是这些对象的组合),并将测试对象上操作的有效性(例如在初始化后拒绝分配给volatile

当遇到const int时,编译器将注册一个具有不同const_cast条件的条目,并相应地进行后续检查,直到包含范围结束。

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