C++中constexpr的用法 简单来说声明为constexpr的函数那么在编译阶段就能得到其返回值故编译器可以直接将对应位置的函数调用直接转换为函数的返回值故其实现了和内联函数一样的功能例如constexpr int test() { return 10; } constxepr int i test() * 3 2;编译器会直接将test()替换为10在编译阶段就可以确定i32。需要注意constexpr的返回值必须是字面值类型变量算术类型、指针、引用、字面值类等函数形参可以是非常量但实参必须是常量例如constexpr int test(int i) { return i; } constxepr int i test(1) * 3 2;是可以的但constexpr int test(int i) { return i; } int j 1; constxepr int i test(j) * 3 2;是会报错的。总的来说constexpr函数用于常量表达式的函数其遵守如下规定1. 返回值和形参都要是字面值2.不一定返回常量表达式。最后说一下为什么用constexpr其优点是编译时计算出表达式的值减少程序运行的开销。if constexprC17引入了这一用法templatebool Flag void demo() { if(Flag) { int x 0; x x.no_member; // Flagfalse 时依然会编译报错整个分支语法检查 } if constexpr(Flag) { int x 0; x x.no_member; // Flagfalse这整个分支直接丢弃不做实例化不会报错 } }核心特性括号内必须是编译期可求值的 bool 常量不选中的分支不会被实例化不会编译展开只能用于函数内部不能直接用在using、类作用域属于语句不是类型工具和std::conditional形成互补if和if constexpr对比普通if两个分支全部语法检查、实例化运行时才走分支if constexpr条件假的分支不实例化不做模板展开仅做基础语法解析。注意未选中分支仍然要满足基础语法合法只是不会实例化模板相关逻辑。比如不能写int {这种语法错误end

今日更新