我已经知道const_cast
做了什么。但是我想知道它是如何完成这项工作的。编译器看到const_cast
时到底做了什么?
答案 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资格。