本節書摘來自華章計算機《c++語言導學》一書中的第1章,第1.7節,[美] 本賈尼·斯特勞斯特盧普 更多章節内容可以通路雲栖社群“華章計算機”公衆号檢視。
c++支援兩種不變性概念:
const:大概的意思是“我承諾不改變這個值”。主要用于說明接口,這樣在把變量傳入函數時就不必擔心變量會在函數内被改變了。編譯器負責确認并執行const的承諾。
constexpr:大概的意思是“在編譯時求值”。主要用于說明常量,作用是允許把資料置于隻讀記憶體中(不太可能被破壞)以及提升性能。
例如:
如果某個函數被用在常量表達式(constant expression)中,即該表達式在編譯時求值,則這個函數必須定義成constexpr。例如:
https://yqfile.alicdn.com/626ebf76dc6fa225e8cf4ad4361875105e86cb0f.png" >
要想定義成constexpr,函數必須非常簡單:函數中僅有一條計算某個值的return語句。constexpr函數可以接受非常量實參,但此時其結果不再是一個常量表達式。當程式的上下文不需要常量表達式時,我們可以使用非常量實參來調用constexpr函數,這樣我們就不用把同一個函數定義兩次了:其中一個用于常量表達式,另一個用于變量。
在有的場合,常量表達式是語言規則所必需的(如數組的界(見1.8節)、case标簽
(見1.9節)、某些模闆參數(見5.2節)和使用constexpr聲明的常量)。另一些情況下,編譯時求值對程式的性能非常重要,是以需要使用常量。即使不考慮性能因素,不變性概念(對象狀态不發生改變)也是程式設計中要考慮的一個重要問題。