是否试图修改一个 const_cast-ed,但动态分配的常量对象仍然是未定义的行为?
Is an attempt to modify a const_cast-ed, but dynamically allocated constant object still undefined behavior?
例如:
const int* pc = new const int(3); // note the const
int* p = const_cast<int*>(pc);
*p = 4; // undefined behavior?
特别是,编译器能否优化掉 堆 分配的 *pc
?
如果不是,尝试通过 p
修改 *pc
是否仍然构成未定义的行为 - 如果是,为什么?
是的,是的。至于为什么 - 因为您正在修改 const
对象。
关于 new
之后的 const
的好处 - 没有它,代码将是合法的。
const_cast
从 const
到非 const
只有当原始指针是非 const
.
时才是安全的
如果原始指针是 const
(如您的示例中的情况),则行为未定义。
如果你写了
const int* pc = new int(3);
那么你可以摆脱pc
的const
-ness。
例如:
const int* pc = new const int(3); // note the const
int* p = const_cast<int*>(pc);
*p = 4; // undefined behavior?
特别是,编译器能否优化掉 堆 分配的 *pc
?
如果不是,尝试通过 p
修改 *pc
是否仍然构成未定义的行为 - 如果是,为什么?
是的,是的。至于为什么 - 因为您正在修改 const
对象。
关于 new
之后的 const
的好处 - 没有它,代码将是合法的。
const_cast
从 const
到非 const
只有当原始指针是非 const
.
如果原始指针是 const
(如您的示例中的情况),则行为未定义。
如果你写了
const int* pc = new int(3);
那么你可以摆脱pc
的const
-ness。