首页  >  文章  >  后端开发  >  为什么 `if constexpr` 在 C 17 中的非模板化函数中不起作用?

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

Barbara Streisand
Barbara Streisand原创
2024-11-06 19:01:03494浏览

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

if constexpr 在 C 17 中的非模板化函数中的行为与预期不同

在 C 17 中,if constexpr 语句允许条件基于编译时常量表达式的编译。但是,当尝试在非模板化函数中使用此功能时,可能会出现意外的编译错误。

考虑以下代码片段:

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

int main()
{
  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>

编译此代码时,会出现错误发生在尝试在 if constexpr 语句中取消引用“value”的行上。这是因为非模板化函数不支持 if constexpr。

为什么只有模板?

此行为是设计使然。 if constexpr 旨在防止基于特定专业化的无效模板代码的实例化。在提供的示例中,非模板化函数使用 std::is_pointer_v 检查“value”是否是指针。但是,如果条件为 false,编译器仍会尝试取消引用整数“value”,这是无效的。

解决方案

在非中使用 if constexpr模板化上下文,请考虑将代码包装在模板函数中或使用在编译时表现不同的宏。例如:

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

template<typename T>
void print(T value)
{
  if constexpr (std::is_pointer_v<T>)
    std::cout << "Ptr to " << *value << std::endl;
  else
    std::cout << "Ref to " << value << std::endl;
}

int main()
{
  auto n = 1000;
  print(n);

  int *ptr = &n;
  print(ptr);
}</code>

在这种情况下,打印函数是模板化的,因此如果基于模板参数正确应用 constexpr 行为。

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

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