constexpr的語義是“常量表達式”,也就是在編譯期可求值的表達式。
constexpr所修飾的變量一定是編譯期可求值的,常見為字面值、全局變量/函數的位址、sizeof等。 constexpr修飾函數,其所有參數都是constexpr。
constexpr int Inc(int i) {
return i + 1;
}
constexpr int a = Inc(1); // ok
constexpr int b = a * 2 + 1; // ok
constexpr int c = Inc(cin.get()); // error
constexpr修飾類的構造函數,該構造函數的參數都是constexpr,該對象也就是constexpr對象(成員變量的初始化都放到初始化清單中)。
struct A {
constexpr A(int x, int y): X(x), Y(y) {}
int X, Y;
};
constexpr A a(1, 2);
constexpr優點:
- 編譯器對constexpr的代碼優化,将用到的constexpr表達式都直接替換成最終結果。
- 相比宏來說,constexpr沒有額外的開銷,但更安全可靠。