字面值:是乙個不能改變的值,如數字、字元、字串等。單引號內的是字元字面值,雙引號內的是字串字面值。
字面值型別(literal type):算數型別、引用和指標等。
常量表示式(const experssion):是指(1)值不會改變 並且 (2)在編譯過程就能得到計算結果的表示式。字面量屬於常量表示式,用常量表示式初始化的const物件也是常量表示式。
乙個物件(或表示式)是不是常量表示式由它的資料型別和初始值共同決定。
const int a =1; //常量表示式
cosnt int b=a+1; //常量表示式
int c=2; //初始值是字面值常量,當c資料型別是普通int。
const int d=fun(); //fun()值要在執行時得到,d不是字面值常量。
c++11新標準規定,允許將變數宣告為constexpr型別以便由編譯器來驗證變數的是否是乙個常量表示式。
宣告為constexpr的變數一定是乙個常量,而且必須用常量表示式初始化。
constexpr函式是指能用於常量表示式的函式。
應遵循的約定:函式返回型別及所有形參的型別都是字面值型別,而且函式體中必須有且只有一條return 語句。
constexpr函式體內可以有其他語句,只要這些語句在執行時不執行任何操作。(例如,空語句、型別別名和using宣告等)
constexpr函式被隱式地指定為內聯函式。
constexpr int fun(int a)
若a是常量表示式,fun(a)就是常量表示式。若a不是常量表示式,fun(a)就是變成普通函式。
當constexpr函式是常量表示式時可以用來初始化constexpr變數。
constexpr宣告中定義了乙個指標,限定符constexpr僅對指標物件有效,與指標所指的物件無關。
const int *p1=nullptr; //p1是指向整形常量的指標
constexpr int *p2=nullptr; //p2是指向整形的常量指標
(等效於 int *const p2=nullptr;)
但constexpr宣告的指標初始值只能是0、nullptr和儲存於某個固定位址中的物件。因為它是常量表示式(常量表示式定義(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 ...
C constexpr 常量表示式
在c 11中引入了constexpr關鍵字.意思是常量表示式,詳細來說就是在編譯期可求值的表示式.可以修飾表示式,函式,建構函式,類等 可以讓編譯器做出尺度更大的優化.這個關鍵字是為了解決以前的const關鍵字帶來的一些問題,其實在 實戰中const顯然是只有readonly唯讀這個概念,其在很多場...