增加顶级const指针时会发生什么?

时间:2018-03-05 07:23:51

标签: c++ const undefined-behavior const-cast

当我试图找出顶级const const_cast 时,我写了一些代码如下。

int main()
{
    // m is a top-level const
    const int m = 10;

    // this is an undefined behavior according to *Primer c++*
    // but I still compile and run this without warning. 
    int *q = const_cast<int *>(&m);
    (*q)++;

    //Then I print the address and the value
    cout<< "the value  of address "<< q <<" is "<< *q <<endl;
    cout<< "the value  of address "<< &m <<" is "<< m <<endl;
    return 0;
}

打印结果让我感到困惑。

the value  of address 0x7ffee6a43ad8 is 11
the value  of address 0x7ffee6a43ad8 is 10

那是未定义的行为吗?当我这样做时真正发生了什么&#34;(* q)++&#34;?

提前致谢

2 个答案:

答案 0 :(得分:2)

请注意,您的代码执行*q++,而(*q)++

使用*q++增加指针。使用(*q)++,您可以增加它所指向的内容。

这一切都很好, 除了 q指向常量值。实际上,试图修改常量值是undefined behavior

如果您改为*q++并增加了指针,那么您就不会修改常量值,这样就可以了。另一方面,它不再指向有效对象,当您在打印指向的值时取消引用q时,您将改为使用UB。

答案 1 :(得分:0)

  

这是未定义的行为之一吗?

是。你真的有两行,每行都可能导致未定义的行为。

int *q = const_cast<int *>(&m);

(*q)++;

在第一个中,您正在使用const_cast删除当使用const限定符创建该对象时指针指向的对象的const

在第二个中,您正在修改const对象的值。

  

当我做的时候真的发生了什么&#34;(* q ++)&#34;?

您必须查看汇编代码以确定编译器使用它做什么。它可以做任何想做的事情。我们无法做出错误的做法。