有人可以向我解釋為什么這段代碼不會改變 a 的值嗎?是否可以更改常量資料值?
情況1:
const int a = 2;
*((int*)&a) = 3;
std::cout << a;
案例2:
const int a = 2;
const_cast<int&>(a) = 3;
std::cout << a;
uj5u.com熱心網友回復:
更改 const 值是未定義的行為。我建議您不要這樣做或撰寫任何這樣做的程式。
uj5u.com熱心網友回復:
不允許修改常量物件。const_cast不過,只要您不嘗試修改該值,就可以將其強制轉換為非常量參考。
9.2.9.2 cv 限定符(強調我的)
(4) 在任何試圖修改([expr.ass] ,[expr.post.incr] ,[expr.pre.incr] )const物件([basic.type.qualifier]在其壽命期間)([basic.life ] )導致未定義的行為。
此外,您的兩個示例基本相同 - c 樣式轉換(轉換符號)可以解釋如下:
7.6.3 顯式型別轉換(cast notation)
(4)的轉化率通過進行
(4.1)一const_-cast([expr.const.cast] ),
(4.2)一static_-cast([expr.static.cast] ),
(4.3)一個static_-cast接著一個const_-cast,
(4.4)一reinterpret_-cast([EXPR .reinterpret.cast] ) 或
(4.5) areinterpret_-cast后跟 aconst_-cast,
可以使用顯式型別轉換的強制轉換表示法來執行。相同的語意限制和行為適用,[...]。
在您的情況下 (4.1) 適用,因此您的編譯器將解釋 c 樣式轉換如下:
const int a = 2;
*((int*)&a) = 3;
// ->
const int a = 2;
*const_cast<int*>(&a) = 3;
基本上,當您確定給定的物件本身不是 const,只有您擁有的參考是時,您才被允許拋棄 constness 并修改物件的唯一時間。
例如:
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
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/395873.html
上一篇:為什么每次運行相同的列印陳述句時記憶體地址都會改變?[復制]
下一篇:c洗掉動態結構中的元素
