是否可以更改 const 数据值?

Is it possible to change a const data value?

谁能给我解释一下为什么这段代码没有改变a的值? 是否可以更改 const 数据值?

案例 1:

const int a = 2;
*((int*)&a) = 3;
std::cout << a;

案例 2:

const int a = 2;
const_cast<int&>(a) = 3;
std::cout << a;

更改常量值是未定义的行为。 我建议您不要这样做或编写任何这样做的程序。

您不能修改常量对象。使用 const_cast 转换为非常量引用是可以的,只要您不尝试修改该值。

9.2.9.2 The cv-qualifiers(强调我的)

(4) Any attempt to modify ([expr.ass], [expr.post.incr], [expr.pre.incr]) a const object ([basic.type.qualifier]) during its lifetime ([basic.life]) results in undefined behavior.


你的两个例子也基本相同 - c 风格的转换(转换符号)可以解释如下:

7.6.3 Explicit type conversion (cast notation)

(4) The conversions performed by
(4.1) a const_­cast ([expr.const.cast]),
(4.2) a static_­cast ([expr.static.cast]),
(4.3) a static_­cast followed by a const_­cast,
(4.4) a reinterpret_­cast ([expr.reinterpret.cast]), or
(4.5) a reinterpret_­cast followed by a const_­cast,
can be performed using the cast notation of explicit type conversion. The same semantic restrictions and behaviors apply, [...] .

在您的情况下 (4.1) 适用,因此您的编译器将按如下方式解释 c 样式转换:

const int a = 2;
*((int*)&a) = 3;

// ->

const int a = 2;
*const_cast<int*>(&a) = 3;

基本上,只有当您确定知道给定对象本身不是时,才允许您放弃常量并修改对象const,只有你的引用是.

例如:

void foo(int const& ref) {
    // we can cast away const here
    // because we know that a in main is NOT const.
    const_cast<int&>(ref) = 2;
}

int main() {
    int a = 1; // a is not const
    foo(a);

    printf("%d", a); // 2
}