首页  >  文章  >  后端开发  >  为什么“if constexpr”会导致 C 17 中的非模板化函数出现编译错误?

为什么“if constexpr”会导致 C 17 中的非模板化函数出现编译错误?

Linda Hamilton
Linda Hamilton原创
2024-11-06 03:20:02774浏览

Why Does

在 C 17 中的非模板化函数中使用“If constexpr”时出错

在 C 17 中,“if constexpr”语句允许基于常量表达式有条件地评估和编译代码。但是,此功能在非模板化函数中使用时有限制。

代码:

<code class="cpp">#include <iostream>
#include <type_traits>

void print(auto value)
{
  if constexpr (std::is_pointer_v<decltype(value)>)
    std::cout << "Ptr to " << *value << std::endl;
  else
    std::cout << "Ref to " << value << std::endl;
}</code>

问题:

当“if constexpr”在非模板化函数中使用时,如上所示,尝试取消引用非指针值时会发生编译错误。出现此错误的原因是,与模板化函数不同,非模板化函数中的“if constexpr”不会阻止编译未采用的代码路径。

说明:

在模板化函数中,“if constexpr”允许根据模板参数的值有条件地编译代码。在这种情况下,编译器可以在编译时确定模板对于给定的专业化是否有效,并且仅实例化必要的代码路径。

但是,在非模板化函数中,“if constexpr”仅充当运行时的条件语句。编译器仍然会分析条件语句的两个分支,如果未采取的分支中有任何代码无效,则会发生编译错误。

解决方案:

为了避免此错误,请仅在模板化函数或非模板化函数中使用“if constexpr”,其中类型在编译时已知,并且保证对条件语句的两个分支都有效。

以上是为什么“if constexpr”会导致 C 17 中的非模板化函数出现编译错误?的详细内容。更多信息请关注PHP中文网其他相关文章!

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