如何解决为什么在 C++ 中使用 const_cast 更改 const 值是合法的
嗨,我正在尝试理解 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 完全可以吗?再说一次,如果不能,那么我应该什么时候使用它?
解决方法
为什么在 C++ 中使用 const_cast 更改 const 值是合法的
为什么您认为“在 C++ 中使用 const_cast 更改 const 值是合法的”以及“合法更改”是什么意思?? >
(†) const 对象的值不能改变。尝试修改 const 对象的行为未定义。
- 为什么需要这个 const_cast
有时您有一个非常量对象的常量引用,并且您想修改该非常量对象。这些情况很少见,因此很少需要 const_cast。
其他时候,您的函数接受指向非常量的指针,但永远不会修改所指向的对象。您可以使用 const_cast 来调用带有指向 const 的指针的此类函数。在使用古老的 C 库时,有时可能会遇到这种情况。小心不要错误地假设“从不修改指向的对象”。
- 像这样使用 const_cast 完全没问题吗?
未定义行为 (UB) 并非完全可以。这完全是坏事。不要这样做。
为什么当 t 是 const 时 *pc 与 t 不同?
看起来可能是这样,因为程序的行为是未定义的。
那么它是否依赖于编译器?
UB 可以依赖编译器。它还可以取决于系统库、CPU 内核数量和月相。对于任何条件的任何组合,不保证行为相同。也不能保证行为是不同的。对任何行为都没有保证。
我们是否可以使用 const_cast 来改变 const 的值?
见上面的 (†)。
,这不应该是非法的,因为拥有 const 对象的全部意义在于它不能被更改。
C++ 使用术语“未定义行为”。这是未定义的行为,因为正如您所说,t
是一个 const
对象。
拥有这个 const_cast 的必要性是什么?在我看来,从我们正在更改 const 对象的意义上来说,这是危险的。
它适用于 const 变量,这些变量引用非常量对象。
考虑代码的这种变体。
char t='a'; // No longer a const char!
const char *pc=&t;
char *p = const_cast<char*>(pc);
这里,pc
是一个“指向 const char
的指针”,但它恰好指向一个 不是 {{1} }.
在这种情况下,代码有效。字符char
可以改变,而指针const
不能用来修改它。
像这样使用 const_cast 完全没问题吗?
不是你使用它的方式。见上文。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。