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