在C++中,指向常量整数的指针

5

在学习C++中的const变量时,我尝试了以下代码:

#include <iostream>

int main()
{
    const int p = 20;

    int* a = const_cast<int*>(&p);

    *a = 10;

    std::cout<<"Value at a: "<<(*a)<<std::endl;
    std::cout<<"Value of p: "<<p<<std::endl;

    std::cout<<"Their addresses : "<<std::endl;
    std::cout<<a<<" "<<&p<<std::endl;
    return 0;
}

它产生的输出如下:
Value at a: 10
Value of p: 20
Their addresses : 
0x7fff4646d7d4 0x7fff4646d7d4

看起来我将值10分配给了p的内存地址,但它们的值是不同的。为什么会这样?

1个回答

9

试图修改一个最初被声明为const的对象将导致未定义的行为。

§7.1.6.1/4 [dcl.type.cv] 除了任何声明了mutable的类成员可以被修改以外,在其生命周期内尝试修改const对象都将导致未定义的行为。

很可能你的编译器会将代码中所有出现的p替换为值20,因为你已经承诺它不会改变。因此打印p的那一行已经变成了:

std::cout<<"Value of p: "<<20<<std::endl;

所以它打印出 20,无论你是否修改了原始对象。当然,由于你有未定义的行为,这种推理是毫无意义的,你不应该在程序中调用未定义的行为。

看起来编译器优化了常量值的打印,实际上在运行时从未读取该值。这就是为什么如果你去除const属性,就需要小心了。 - Will

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接