使用const_cast是否属于未定义行为?

8
这里发生了什么?
const int a = 0;
const int *pa = &a;

int *p = const_cast<int*>(pa);
*p = 1;  // undefined behavior ??
cout << a << *p;  // ??

我的编译器输出0和1,但'a'的地址和'p'的值相同,所以我很困惑这是怎么可能的。

3个回答

17

引用自cppreference

即使 const_cast 可以从任何指针或引用中去除 constness 或者 volatile 特性,但是使用结果指针或引用来写入声明为 const 的对象或访问声明为 volatile 的对象将会产生不确定行为。

所以,修改常量变量是不确定行为。你看到的输出是因为你告诉编译器变量 a 永远不会改变,所以它可以在 cout 行中放置字面值 0 代替变量 a


7

§7.1.6.1 [dcl.type.cv]/p4:

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


1
试图对一个常量值进行写操作是未定义的行为,例如允许编译器将const值分配到只读内存中(通常在代码段中)或在编译时将其值嵌入表达式中,这就是你的情况发生的事情。

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