C++ if constexpr相关术语discarded、instantiated等含义问询
if constexpr 相关术语含义解答 1. 关于discarded的含义
你此前的理解存在偏差。discarded翻译为「被舍弃分支」,指该分支不会被编入最终生成的可执行程序,但不代表编译器完全不处理该分支的代码:
若constexpr if的条件常量表达式结果为真,则else分支(statement-false)被舍弃;若结果为假,则if主分支(statement-true)被舍弃。
舍弃分支的具体处理逻辑需要结合场景判断,并不是存在非法字符也不影响编译,相关规则见后两个术语的解释。
2. 关于instantiated的含义
instantiated翻译为「实例化」,是C++模板体系的专属概念,指编译器根据传入的模板实参,将模板实体(模板函数、模板类等)生成对应具体类型可执行代码的过程。
若constexpr if出现在模板实体内部,且条件在实例化后不依赖模板参数的值,则外围模板实例化时,不会实例化被舍弃的分支。
这是if constexpr的核心能力:比如在模板函数中用if constexpr做类型分支判断时,只要对应模板参数下被舍弃的分支,哪怕分支内的代码不符合当前模板参数的语法要求,也不会触发编译错误。
3. 关于checked的含义
你此前的理解基本正确。checked翻译为「语法语义检查」,指编译器会对代码做完整的合法性校验:
在模板外部的被舍弃分支会被完整检查,因此
if constexpr不能替代#if预处理指令。
也就是说如果if constexpr写在非模板的普通代码中,哪怕是永远不会执行的被舍弃分支,也必须是合法的C++代码,比如分支内存在int a = "字符串"这种明显的类型错误,编译器依然会直接报错,这也是它和预处理指令#if的核心区别:#if不满足的分支在预处理阶段就会被彻底删除,内部就算存在乱码也不会触发报错。
内容的提问来源于stack exchange,提问作者user15071942

