代码:
const char var = 'a';
auto static_var = static_cast<char>(var);
auto const_var = const_cast<char*>(&var);
cout << "var: \t\t" << var << "\taddress:\t" << reinterpret_cast<long>(&var) << endl;
cout << "static_var: \t" << static_var << "\taddress:\t" << reinterpret_cast<long>(&static_var) << endl;
*const_var = 'b';
cout << "const_var: \t" << *const_var << "\tptr:\t\t" << reinterpret_cast<long>(const_var) << endl;
cout << "var(direct): \t" << var << "\taddress:\t" << reinterpret_cast<long>(&var) << endl;
cout << "var(ptr): \t" << *(&var) << "\taddress:\t" << reinterpret_cast<long>(&var) << endl;
输出:
var: a address: 6122386111
static_var: a address: 6122386110
const_var: b ptr: 6122386111
var(direct): a address: 6122386111
var(ptr): b address: 6122386111
平台:
请教大家一下, 为何最后两种输出的结果不一样, 这是什么原因导致的
1
lnstrument 2022-11-30 19:12:12 +08:00
1.编译器认为 var 是常量
2.const_cast 之后再写可能是 ub [Note: Depending on the type of the object, a write operation through the pointer, lvalue or pointer to data member resulting from a const_cast that casts away a const-qualifier may produce undefined behavior (9.2.8.1). — end note] |
2
nlzy 2022-11-30 19:34:00 +08:00
a) 修改常量对象属于未定义行为
b) 若程序出现未定义行为,则程序可以做任何(匪夷所思的)事,整个程序失去意义 |
3
smdbh 2022-11-30 21:19:52 +08:00
同意楼上
|
4
Zizpop OP |
5
Zizpop OP |
6
cnbatch 2022-12-01 18:01:40 +08:00
可以查阅 C++标准,1 楼给出的那段文字,位于 ISO IEC 14882 2020-12 的 PDF 的第 126 页。
国内有转载: https://bbs.pediy.com/thread-267401-1.htm |
7
cnbatch 2022-12-01 18:04:22 +08:00
对于未定义行为就没必要去纠结了,这种情况下编译器想怎么干都行,甚至直接让整个程序崩溃都不奇怪
|
8
FurryR 2022-12-30 12:27:48 +08:00
会不会是因为在 static_cast 的时候实际上拷贝了一次呢?不过后定义的变量为什么地址比常量低呢?是因为常量默认放在变量后面吗?
|