首页  >  文章  >  后端开发  >  为什么 `if constexpr` 在非模板化 C 函数中不能按预期工作?

为什么 `if constexpr` 在非模板化 C 函数中不能按预期工作?

Susan Sarandon
Susan Sarandon原创
2024-11-06 10:54:02496浏览

Why Doesn't `if constexpr` Work as Expected in Non-Templated C   Functions?

如果 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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn