C++ const (二) constexpr和常量表達式,constexpr函式
阿新 • • 發佈:2021-10-02
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函式定義在標頭檔案中,這兩種函式可以在程式中多次定義
但是多個定義必須完全一致