常量表示式:是指值不會改變並且在編譯過程就能得到計算結果的表示式。顯然字面值屬於常量表示式,用於表示式初始化的const物件也是常量表示式。
1、判斷乙個變數是不是常量表示式
乙個物件(表示式)是不是常量表達由資料型別和初始值共同決定,例如:
const int max_files = 20; // man_files是常量表示式
const int limit = max_files +1; // limit是常量表示式
int staff_size = 27; // staff_size 不是常量表示式
const int sz = get_size(); // sz不是常量表示式
解釋:儘管staff_size的初始值是字面常量,但是由於他的資料型別只是乙個普通int而不是const int,所以它不屬於常量表示式。
另一方面,儘管sz本身是乙個常量,但他的具體值直到執行時才能獲取到,所以也不是常量表示式。
2、判斷乙個變數的初始值是否為乙個常量表示式
在乙個複雜的系統中我們很難辨別乙個初始值是不是乙個常量表示式。
c++11標準規定,允許將變數宣告為constexpr型別,讓編譯器驗證這個變數的初始值是不是乙個常量表示式。
這裡強調一點,constexpr是用來驗證變數的初始值是不是乙個常量表示式。例如:
constexpr int mf = 20; // 20是常量表示式
constexpr int limit = mf + 1; // mf + 1是常量表示式
constexpr int sz = size(); // 只有size()是乙個constexpr函式時,才是一條正確的宣告語句
儘管普通函式不能作為constexpr變數的初始值,但是新規允許一種特殊的consrexpr函式,這種函式必須足夠簡單使得編譯器編譯時就可以計算結果。這樣就能用constexpr函式去初始化constexpr變數。
3、constexpr與指標
constexpr的指標初始化必須是nullptr 或0.或者是儲存於某個固定位址的物件。
必須明確一點,constexpr宣告中定義了乙個指標,限定符constexpr僅對指標有效,與指標所指的物件無關。
const int *p = nullptr;
constexpr int *p1 = nullptr;
constexpr const int *p = &i;
constexpr int *p1 = &j;
這裡要說明一下,i和j都必須要定義在函式外面。
C 中 const 和 constexpr特性
const 是乙個關鍵字修飾符,用於修飾常量,說明變數是不可改變的常量,一經定義賦值不可改變。const 修飾的變數具有以下特點 const 常量只能在宣告的時候賦值。如果乙個類內的成員變數被宣告為const 常量,則該成員變數必須使用初始化列表的方式進行初始化。const 修飾指標變數是規則有點特...
constexpr和常量表示式
常量表示式是指不會改變且在編譯過程中就能計算出來的表示式。字面值是常量表示式,用常量表示式初始化的const物件也是常量表示式。乙個物件或表示式是不是常量表達是由它的資料型別和初始值共同決定。例 const int a 10 常量表示式 const int b a 5 常量表示式 int c 3 不...
c 筆記 內聯函式和constexpr函式
將函式指定為內聯函式,通常就是將它在每個呼叫點上 內聯地 展開。在函式的返回型別前面加上關鍵字inline,這樣就可以將它宣告成內聯函式了 inline const string shorterstring const string s1,const string s2 內聯機制用於優化規模較小 流...