微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么在 C++ 中使用 const_cast 更改 const 值是合法的

如何解决为什么在 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,正如我在控制台中看到的那样。我的问题如下:

  1. 这不应该是非法的,因为拥有 const 对象的全部意义在于它不能被更改。
  2. 拥有这个 const_cast 的必要性是什么,在我看来,从我们正在更改 const 对象的意义上说这是危险的。
  3. 像这样使用 const_cast 完全可以吗?再说一次,如果不能,那么我应该什么时候使用它?

解决方法

为什么在 C++ 中使用 const_cast 更改 const 值是合法的

为什么您认为“在 C++ 中使用 const_cast 更改 const 值是合法的”以及“合法更改”是什么意思?? >

(†) const 对象的值不能改变。尝试修改 const 对象的行为未定义。

  1. 为什么需要这个 const_cast

有时您有一个非常量对象的常量引用,并且您想修改该非常量对象。这些情况很少见,因此很少需要 const_cast。

其他时候,您的函数接受指向非常量的指针,但永远不会修改所指向的对象。您可以使用 const_cast 来调用带有指向 const 的指针的此类函数。在使用古老的 C 库时,有时可能会遇到这种情况。小心不要错误地假设“从不修改指向的对象”。

  1. 像这样使用 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 举报,一经查实,本站将立刻删除。