2

对于下面的片段,

#include <iostream>
using namespace std;

void fun(const int *p)
{
    int *q = const_cast<int *>(p);
    *q = *q * 10;
    cout<<"q: "<<q<<"\t Value: "<<*q<<endl;
}

int main()
{
    const int a = 10;
    const int *z = &a;
    fun(z);
    cout<<"z: "<<z<<"\t"<<"Address of a: "<<&a<<endl;
    cout<<"value at z: "<<*z<<"\t\t value in a: "<<a<<endl;
}

产生的输出是

q: 0x7fff65910fcc    Value: 100
z: 0x7fff65910fcc   Address of a: 0x7fff65910fcc
value at z: 100      value in a: 10

为什么即使我尝试在 fun() 中修改 a 的值,它的值也没有被修改?

为什么 a 和指针 z 的地址相同但值不同?

const_cast 是某种未定义的行为吗?

4

1 回答 1

10

const_cast 是某种未定义的行为吗?

的,您的程序包含未定义的行为。

这意味着您不能对其输出有任何期望。原因由 C++11 标准的第 7.1.6.1/4 段给出:

mutable除了可以修改声明的任何类成员(7.1.1)外,任何const 在其生命周期(3.8)期间修改对象的尝试都会导致未定义的行为

第 5.2.11/7 段const_cast包含进一步的警告:

[注意:根据对象的类型,通过指针、左值或指向数据成员的指针的写入操作由 aconst_cast丢弃const- 限定符可能会产生未定义的行为 (7.1.6.1)。——<em>尾注]

于 2013-05-12T09:28:03.223 回答