const TYPE 究竟限制的是什麼?

時間 2021-09-14 10:10:17

1樓:丁冬

護欄究竟限制的是什麼?

按照生活的常識,護欄是防止我掉進河裡的,但是如下操作,就可以掉河裡了?

簡單來說,const 就是這個欄杆,欄杆可以降低你腳滑掉河裡的風險,但是你故意翻越(顯式轉換)還是會掉河裡。

2樓:暮無井見鈴

你的理解是錯誤的。這裡 (int*) (或者等價的 const_cast() )強制轉型出來的東西是指標型別的純右值,從 C++98 至今都不會生成臨時物件(假設這是問題裡說的「臨時變數」)。

另外這個程式有語義錯誤。修改 const 物件,至少是 const 完整物件的非 mutable 子物件導致未定義行為。編譯器可以對未定義行為產生任何符合或不符合期待的結果,而不必告知使用者。

比如這裡的例子就是優化(雖然考慮到 odr 式使用的規則,這可能不算優化)導致不一致的結果。

const T* 限制的是「經由該指標值修改被指向的物件」。你如果把它轉型成 T* 來進行寫入,就要自己承擔「它可能指向不可修改的物件,進行修改導致不期望的未定義行為」的風險。

3樓:Reclair

沒有通讀 C++ 過標準文件,暫且說一下個人理解,如有錯誤望諒解。

對於本源是 const 的變數,去除 const 修飾符的行為雖然可以接受,但對其進一步的修改是未定義行為。

對於輸出 10 的原因,題主的想法是正確的。聰明的編譯器能夠認出哪些 const 是真的編譯時常量(即 constexpr),並在彙編中進行替換,因此第一句 cout 輸出的物件被硬編碼為 10。

需要注意,優化的行為隨不同編譯器和編譯選項而變化。我在 Ubuntu 下用 gcc 編譯時,無優化選項時會為 a 分配棧空間,但使用 -Og (O1、O2) 後,對 a 和 *(&a) 的訪問都優化成了 10,從這裡就可以看出對 const 變數的修改是不明智的。

至於 const,其本身只是限制了變數在初始化之後不可修改,但其初始化值並不一定是常量,例如 const int a = sin(x); 因此在無任何優化得情況下是會分配棧空間的,此時存在通過指標修改它的可能(需要嚴格限制為編譯時常量時使用 constexpr)。

題主的情況可能就是即為 a 分配了棧空間,又優化了所有對 a 的直接訪問。然而我在使用 gcc 時,要麼沒有任何優化(輸出兩個 20),要麼對所有 a 的訪問都進行了優化(輸出兩個 10),顯然這裡存在未定義行為。

4樓:

你不強制轉換的話,就不能改,但它攔不住你強制轉換。

這裡的強制轉換應該是未定義的行為,比如本例中就出現了 10 20 不匹配的情況,還有可能段錯誤等。

搞科研究竟有多燒錢?經費問題是限制科研發現速度的最主要因素麼?

閆巖 搞科研的才知道有多燒錢,各種 沉沒成本 經費問題對科研發展有很大影響,但我認為還不至於是決定性的,人才很重要,留住人才不僅僅靠的是錢,更重要的是良好的科研環境。 陳豪 科研真的是非常特別燒錢!都說科研就是一場燒錢的遊戲,試劑抗體細胞上千起 毒素標準品隨便幾毫克上萬起,儀器上百萬,就連每天都用到...

公考報名是報限制專業還是不限制專業

粉筆教育 從報考人員組成來看,限制專業的崗位報考人員更統一,都是同專業 不限專業的崗位人員組成範圍更廣,來自不同專業。從競爭比例來看,限制專業的崗位比不限專業的崗位的壓力小一些。但是,在絕對的實力面前,一切不堪一擊。如果有考崗位第一的實力,不管崗位報考人數有多少,都能無所畏懼。加油。 格正公考 不管...

限制手機效能發展的是電池嗎?

暮色畫橋碎墨香 個人感覺不全是,不恰當的比喻像一系列的連鎖反應,電池容量的大小限制了續航,太大的電池必定會佔據機身更多的空間,而這樣又會在手感 如握持度 上有一定的影響,比如說機身變厚,螢幕邊大等。但是小電池又會影響續航,體驗感下降,所以快充的普及再一定程度上彌補了小電池的缺點。 赤井秀一 答案可以...