首页 >后端开发 >C++ >为什么我不能在 C 17 的非模板化函数中使用 `if constexpr`?

为什么我不能在 C 17 的非模板化函数中使用 `if constexpr`?

Susan Sarandon
Susan Sarandon原创
2024-11-06 04:13:02556浏览

Why Can't I Use `if constexpr` in Non-Templated Functions in C  17?

C 17 的“if constexpr”仅限于模板函数

在 C 17 中,“if constexpr”的引入引发了人们对其的兴趣根据编译时常量有条件地执行代码的能力。但是,尝试在非模板化函数中使用它时会出现问题。

考虑以下代码:

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

void print(auto value)
{
  // Compile-time check if value is a pointer
  if constexpr (std::is_pointer_v<decltype(value)>)
    std::cout << "Ptr to " << *value << std::endl;
  else
    std::cout << "Ref to " << value << std::endl;
}

int main()
{
  // Error when printing a non-pointer
  print(100);
}</code>

虽然此代码在模板化函数中编译时没有错误,但它会失败并显示放置在非模板化函数(如 print)中时出现编译错误。原因在于“if constexpr”的行为。

“if constexpr”旨在允许模板代码的条件编译。在模板函数中,编译器在编译时推断参数的类型,从而能够根据类型选择适当的代码路径。在这种情况下,当 print 函数被模板化时,它可以在编译时识别 value 是否为指针并执行相应的代码分支。

但是,在非模板化函数中,value 的类型是已知的仅在运行时,使“if constexpr”无效。编译器将条件的两个分支都视为可执行代码,当 value 为整数时尝试取消引用 Ptr 中的值以进行分支时,会导致编译错误。

要避免此问题,需要放置 " if constexpr" 在模板函数中或向非模板函数提供显式类型信息以确保编译时类型推导。

以上是为什么我不能在 C 17 的非模板化函数中使用 `if constexpr`?的详细内容。更多信息请关注PHP中文网其他相关文章!

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