constexpr
- c++中为了完善语言体系,与预处理常量、运行时常量区分开,c++引入了一个新的关键字,“constexpr”用来实现真正的编译期常量。
- constexpr这个关键字可以从字面意义上理解为常量表达式,它是一个特殊的类型修饰符:任何表达式、函数只要带上它就会具有编译期常量的特性,能够用于编译期计算,例如:
constexpr int MAX = 100;
constexpr long mega_bits(){
return 1024*1024;
}
- 当然了,因为编译期计算的特殊性,constexpr也无法让所有的变量、函数都在编译期可用,其用起来也有很多的限制。
对于表达式,基本的要求不能含有运行时语法元素,不能是string/vector等需要运行时动态分配的复杂类型,通常只能是整数,字符串等字面量,而array因为能够在编译期确定长度,是可以应用constexpr的:
constexpr auto val = 100;
constexpr auto str = "hello";
constexpr array<int, 3> arr {1,2,3};
constexpr vector<int> vec;
constexpr string s = "str";
constexpr map<int,int> m;
- 当用constexpr修饰函数的时候,限制就更多了,例如不能用try-catch,不能是虚函数,不能动态分配内存…原则是只要不涉及复杂的运行时特性,就可以在编译期执行。