如果 C 17 中的 constexpr 不适用于非模板化函数
简介
C 17 标准引入了 if constexpr 构造,它允许基于常量表达式的条件执行。但是,据观察,如果 constexpr 在模板化函数和非模板化函数中使用时行为不同。
问题
考虑以下非模板化函数:
<code class="cpp">void print() { auto value = 100; if constexpr (std::is_pointer_v<decltype(value)>){ std::cout << "Ptr to " << *value << std::endl; // Error } else { std::cout << "Ref to " << value << std::endl; } }</code>
此代码会导致编译错误,因为 *value 对于推导的类型 int 无效。
答案
此行为是设计使然。在模板化函数中, if constexpr 可以避免实例化对于特定模板特化无效的分支。但是,在非模板化函数中,if constexpr 不会抑制未采用分支的编译。
if constexpr 语句的两个分支都会被解析和分析,即使未采用的分支无效。因此,在上面的代码中,编译器将尝试计算 int 类型的 *value,从而导致错误。
结论
理解这种区别很重要当使用 if constexpr 时。在非模板化函数中,它只能用于检查保证对输入参数的所有可能值都有效的常量表达式。
以上是为什么 `if constexpr` 在非模板化 C 函数中不能按预期工作?的详细内容。更多信息请关注PHP中文网其他相关文章!