
代码:
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 的时候实际上拷贝了一次呢?不过后定义的变量为什么地址比常量低呢?是因为常量默认放在变量后面吗? |