当我试图找出顶级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;?
提前致谢
答案 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;?
您必须查看汇编代码以确定编译器使用它做什么。它可以做任何想做的事情。我们无法做出错误的做法。