是否可以更改 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
}
谁能给我解释一下为什么这段代码没有改变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) aconst_cast
([expr.const.cast]),
(4.2) astatic_cast
([expr.static.cast]),
(4.3) astatic_cast
followed by aconst_cast
,
(4.4) areinterpret_cast
([expr.reinterpret.cast]), or
(4.5) areinterpret_cast
followed by aconst_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
}