天天看點

constexpr 編譯期可求值

    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優點:

  1. 編譯器對constexpr的代碼優化,将用到的constexpr表達式都直接替換成最終結果。
  2. 相比宏來說,constexpr沒有額外的開銷,但更安全可靠。

繼續閱讀