1. 程式人生 > 其它 >C++ const (二) constexpr和常量表達式,constexpr函式

C++ const (二) constexpr和常量表達式,constexpr函式

constexpr和常量表達式

2.5 constexpr和常量表達式

常量表達式:
不會改變且在編譯過程中就能得到計算結果

常量表達式:
字面值,用常量表達式初始化的const物件也是常量表達式

const int max_files = 20;
const int max_fils_2 = max_files+1;
int s = 1;//不是常量表達式
const int sz = get_size();//sz不是常量表達式,因為具體值到執行時才能得到,所以不符合在編譯中就得到結果這個條件

C++11規定可以用constexpr來驗證變數的值是否是一個常量表達式,必須用常量表達式初始化

C++11還允許定義constexpr函式,用於初始化constexpr變數

使用到的型別需要是字面值型別

:算術型別,引用,指標是字面值型別

自定義類,IO庫,string等不是字面值型別

constexpr指標初始值必須是nullptr或0,或是儲存於某個固定地址中的物件

定義在所有函式體外的物件地址固定不變

閱讀C++primer 6.1.1節

constexpr宣告中定義一個指標,僅對指標有效

const int *p = nullptr;//指向整型常量的指標
constexpr int * q = nullptr;//常量指標

constexpr會將定義的物件置為頂層const

constexpr指標可以指向常量也可以指向非常量

constexpr int *np = nullptr;
int j = 0;
constexpr int i = 42;//i,j都應定義在所有函式外
constexpr const int*p = &i;
constexpr int *p1 = &j;

constexpr函式

約定:函式只能有一條return語句 返回型別和所有形參型別都應該是字面值型別

constexpr函式會被隱式的指定為行內函數,在編譯過程中隨時展開

函式中可以有空語句,類型別名,using宣告(執行時不執行任何操作就可以)

constexpr size_t scale(size_t cnt){ return new_sz()*cnt;}
//對於此函式,如果實參為常量表達式,則返回值也是常量表達式,反之不是
(允許constexpr函式的返回值不是常量)
int arr[scale(2)];
int i = 2;
int a2[scale(i)];//錯誤,scale(i)不是常量表達式,但是執行時沒有報錯

一般將行內函數和constexpr函式定義在標頭檔案中,這兩種函式可以在程式中多次定義

但是多個定義必須完全一致