C constexpr 常量表示式

2021-10-25 02:43:21 字數 1467 閱讀 1491

在c++11中引入了constexpr關鍵字. 意思是常量表示式, 詳細來說就是在編譯期可求值的表示式. 可以修飾表示式, 函式, 建構函式, 類等… 可以讓編譯器做出尺度更大的優化.

這個關鍵字是為了解決以前的const關鍵字帶來的一些問題, 其實在**實戰中const顯然是只有readonly唯讀這個概念, 其在很多場合上並不符合邏輯常量這個概念, 就比如說:

const

intf()

intmain()

// 會報錯

上述這個**, 我們會得到報錯: 函式呼叫在常量表示式中必須具有常量值 和 表示式的計算結果不是常數 .

然而在邏輯上, 上面這個函式返回的明顯是乙個邏輯上的常量.

常量表示式函式

而在使用了constexpr之後, 編譯器就會大膽地對f()進行優化, 比如說直接內聯了它, 而不需要等到執行時候才去計算

constexpr

intf()

intmain()

//可以通過

但是編譯器並不會因為你告訴它某個函式或者某個表示式是常量表示式之後, 就一定會百分百信任你.

常量表示式函式只有當整個函式都是常量表示式的時候, 那麼它才會在編譯時確定返回值.

其他情況下的, 即使使用了關鍵字修飾, 其會變成普通函式,編譯器識別到之後該報錯的還是會報錯的.

constexpr

intf

(int x)

intmain()

總的來說,constexpr給了程式非常好的約束條件, 比如把函式形參設定為一定要常量表示式, 這樣可以減少執行時候的開銷, 對比巨集定義來說的話更加安全可靠.

constexpr類

把該類必須至少有乙個constexpr修飾的建構函式

class

point

//初始化列表和空的函式體

constexpr

point()

:point(0

,0)}

;int

main()

const和constexpr同時使用

一般情況下, constexpr已經包含了const的語義, 因此沒有必要同時使用, 但是也有特殊情況:

static

constexpr

int n =3;

intmain()

因為n是乙個常量, 但是你不能用乙個普通指標去指向乙個常量, 因此你只能用乙個const指標去指向.

常量表示式

字面值 是乙個不能改變的值,如數字 字元 字串等。單引號內的是字元字面值,雙引號內的是字串字面值。字面值型別 literal type 算數型別 引用和指標等。常量表示式 const experssion 是指 1 值不會改變 並且 2 在編譯過程就能得到計算結果的表示式。字面量屬於常量表示式,用常...

常量表示式

為了使函式獲取編譯時計算的能力,你必須指定constexpr關鍵字到這個函式。constexpr int multiply int x,int y 將在編譯時計算 const int val multiply 10,10 除了編譯時計算的效能優化,constexpr的另外乙個優勢是,它允許函式被應用...

解析常量表示式

define crt secure no warnings include include include intisnum char ch void eatspace char str char roundbmatch char str,int pindex double getnum char ...