c++ - 为什么 const_cast 删除指针的 constness 而不是指向 const 的指针?

标签 c++ const-cast

我了解 const_cast 适用于指针和引用。

我假设 const_cast 的输入应该是一个指针或引用。我想知道如果输入是对 const int 的指针/引用,为什么它不会删除 constness?

以下代码按预期工作。

  1. const_cast 带多级指针

    int main()
    {
        using std::cout;
        #define endl '\n'
        const int * ip = new int(123);
        const int * ptr = ip;
        *const_cast<int*>(ptr) = 321;
        cout << "*ip: " << *ip << endl;  // value of *ip is changed to 321
    }
    

    但是当我尝试使用指向 const int 的指针或引用 const int 时,值似乎没有改变。

  2. const_cast 引用 const int

    int main()
    {
        using std::cout;
        #define endl '\n'
        const int i = 123;
        const int & ri = i;
        const_cast<int&>(ri) = 321;
        cout << "i: " << i << endl;  // value in 'i' is 123
    }
    
  3. const_cast 带有指向 const int 的指针

    int main()
    {
        using std::cout;
        #define endl '\n'
        const int i = 123;
        const int * ri = &i;
        *const_cast<int*>(ri) = 321;
        cout << "i: " << i << endl;  // value in 'i' is 123
    }
    

(1) 按预期工作,但我无法理解为什么 (2)(3) 不起作用我认为虽然 const_cast 的输入是指针/引用的方式。

请帮助我理解这背后的理念。谢谢。

最佳答案

有两种常量。

object 的常量是对象的固有属性。它不能改变。

想想打印书中的一页。可以看成一串字符,不能更改。它说的是它所说的,就是这样。所以它是一个const string

现在想想黑板。上面可能写了一些东西。你可以把它擦掉,然后写点别的。所以黑板是一个非常量的string

另一种常量是指针常量和引用常量。这种常量性不是指向对象的固有属性,而是权限。它表示您不允许通过此指针修改对象。它没有说明对象本身是否可以修改。

所以如果你有一个 const 指针,你不一定知道它真正指向什么。也许它是一个书页。也许它是一 block 黑板。指针不告诉。

现在,如果您确实知道它确实是一 block 黑板,您可能会很讨厌并要求允许继续更改上面写的内容。这就是 const_cast 所做的。它允许你做某事。

如果您要求修改字符串的权限,结果是打印页面,会发生什么?你得到你的许可,你继续删除它......并且......究竟发生了什么是undefined。也许什么都没有。也许打印被弄脏了,您既不能识别原始字符串,也不能在上面写任何东西。也许你的世界会爆炸成碎片。你可以试试看,但不能保证明天也会发生同样的事情。

关于c++ - 为什么 const_cast 删除指针的 constness 而不是指向 const 的指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52111035/

相关文章:

面向 C# 开发人员的 C++

c++ - 动态链接器 - 如何找到丢失的符号

c++ - 删除 C++ 中 vector 的 const 限定符

c++ - Qt 实例 const_cast

c++ - shared_ptr<const A> 到 shared_pointer<A>

C++。如何将 const_cast 指针指向成员函数?

c++ - 临时修改 const 成员函数中的字段

c++ - 模板函数采用任何仿函数并返回仿函数返回的类型

c++ - 如何在 Windows 7 下在内存有限的计算机上读取大文件?文件大小为 25GB 但 RAM 容量仅为 16GB

c++ - Visual Studio 2013 中的调试技巧 c++