【发布时间】:2021-05-16 07:10:54
【问题描述】:
您好,我正在尝试理解 C++ 中的显式转换,因此通过创建不同的示例来玩弄。下面我给出一个我认为应该是非法的示例,因为它会更改 const 对象的值。
const char t='a';
const char *pc=&t;
char *p = const_cast<char*>(pc);
std::cout<<"Before changing t "<<*pc<<std::endl;
*p='c';
std::cout<<"After channging t: "<<*pc<<std::endl;
执行程序后,对象 t 的值成功更改为 c,正如我在控制台中看到的那样。我的问题如下:
- 这不应该是非法的吗,因为拥有一个 const 对象的全部意义在于它不能被更改。
- 拥有这个 const_cast 有什么需要,在我看来,从某种意义上说,我们正在更改 const 对象是很危险的。
- 像这样使用 const_cast 完全可以吗?再说一次,如果不是,那么我应该什么时候使用它?
【问题讨论】:
-
它是非法的。如果你抢劫了某人并且没有被抓到,那么抢劫是否合法?
-
参见this question 以了解
const_cast的有效用法。 -
如果你输出
t的值而不是*pc的值,你可能会发现它的值实际上并没有改变。 Example -
是的,为什么当 t 为 const 时 *pc 与 t 不同?我还检查了 t 是非 const 的情况。在这种情况下,t 的值实际上与 const 情况不同。我认为这可能是因为创建了一个临时变量。
-
编译器允许您在无需诊断 (NDR) 的情况下编写未定义行为 (UB) 的原因是因为一般情况可能难以确定代码何时会遇到 UB。其中“困难”在于“我们还没有解决停机问题”。
标签: c++ c++11 casting type-conversion constants