Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/133.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 删除常量后重写值时未处理的异常_C++_Const Cast - Fatal编程技术网

C++ 删除常量后重写值时未处理的异常

C++ 删除常量后重写值时未处理的异常,c++,const-cast,C++,Const Cast,代码如下:- const int temp=100; class A { public: void fun(int& temp) { cout<<"am inside fun()"<<endl; temp = 2000; <<<<<<<<<<<<<<Here getting exception....

代码如下:-

const int temp=100;

class A
{
public:
    void fun(int& temp)
    {
        cout<<"am inside fun()"<<endl;
        temp = 2000;            <<<<<<<<<<<<<<Here getting exception....
        printf("in fun() temp[%p] temp val[%d]\n",&temp, temp);
    }
};

int main()
{
    A a;
    printf("in main() temp[%p] temp val[%d]\n",&temp, temp);
    a.fun(const_cast<int&>(temp));
    cout<<"temp:"<<temp<<endl;
    system("pause");
    return 0;
}
在这种情况下,即使我明确删除了常量,它也不允许我在fun中覆盖temp。当我在main中声明temp时,一切正常,即它允许我在乐趣中覆盖该值

在VS2008中编译

有人能帮我找出这两种情况之间的行为差异吗

丢弃原始常量并尝试修改是未定义的行为


您不一定会得到一个异常,但您很幸运地得到了一个。

试图修改常量对象会导致未定义的行为

不能删除常量对象的常量


在这种情况下,编译器会生成一个异常,而不仅仅是行为怪异和继续。区别在于全局变量可能位于只读内存段中,因此修改它的尝试可能会被CPU捕获,而局部非静态常量变量很可能被放入CPU寄存器或堆栈中,在那里可以修改它。也就是说,您应该避免更改定义为const的变量,而只使用const_cast来重新获得对最初定义为non-const的变量的写入权限。

这是运行时异常吗?或编译时?这将导致运行时错误,可能是访问冲突/SEGFULT。@CollinDauphinee是的,就是这样……常量变量可能分配到内存的只读段中。您是否检查了您得到的异常情况?调试器对异常原因怎么说?@ravi:如果不提供详细信息就声称它不完全正确,这对任何人都没有帮助。。。你认为具体什么时候允许?我仔细研究了这个标准,在所有可以想象的局部变量的边缘情况下,它似乎都是显式的未定义行为,甚至在新的常量intn上书写。。。。干杯。小更正:应该区分静态存储持续时间的对象和自动/动态存储持续时间的对象。全局变量具有静态存储持续时间,就像函数本地静态对象一样。生成异常的不是编译器,而是操作系统,它保护自己不受只读内存写入尝试的影响。