看下面一段代码:
情形一
#include <iostream>
int main() {
int i = 3;
const int& cref_i = i;
const_cast<int&>(cref_i) = 4; // OK: modifies i
std::cout << "i = " << i << " cref_i = " << cref_i << std::endl;
std::cout << "i address: " << &i << " cref_i address: " << &cref_i << std::endl;
getchar();
return 0;
}
运行结果:
再看这一段代码:
情形二
#include <iostream>
int main() {
const int i = 3;
const int& cref_i = i;
const_cast<int&>(cref_i) = 4; // OK: modifies i
std::cout << "i = " << i << " cref_i = " << cref_i << std::endl;
std::cout << "i address: " << &i << " cref_i address: " << &cref_i << std::endl;
getchar();
return 0;
}
运行结果:
对比两段代码,只有一处不同,就是
const int i = 3;
有const和没有const的情况,如果不对比,还真没发现问题。
cref_i对值修改成功了,都改成了4,而且i和cref_i的地址都相同,输出的结果却不同,这就是让人疑惑的地方。我们断点调试:
这里看到的都是4
我们看汇编代码(vs中查看汇编的方法:菜单栏->调试->窗口->反汇编,快捷键
Alt+Ctrl+D)
我们看到了编译器直接将3赋值给i,而不是工内存中读取。这就解释了为什么指向内存中同一个地址,输出的值却不同!此时输出的是i=3 cref_i=4
回头我们看看没有情形一中的:
这次是从内存中读取的,这就解释了情况一时的输出i=4 cref_i=4的原因。
参考:
https://www.cnblogs.com/zhuwbox/p/3383188.html