天天看点

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没有额外的开销,但更安全可靠。

继续阅读