2

我有以下代码

static constexpr bool condition = true;

int square(int num) {
    if constexpr (condition) {
      return num * num;
    } else {
      x
      return num;
    }
}

int main() {
    return square(3);
}

编译

-std=gnu++17

我的假设

if constexpr (condition)

是在编译期间

    } else {
      x
      return num;
    }

被丢弃,我没有得到关于未定义的错误

X

我的理解是错误的,这个'if constexpr'类似于

#ifdef CONDITION
  return num * num;
#else
  x
  return num;
#endif

如何修改可以编译的代码?

谢谢您的帮助

4

2 回答 2

8

如何修改可以编译的代码?

要修复您的代码,只需删除带有x.

我的理解是错误的吗,这个“if constexpr”类似于 [...]

是的,你的理解是错误的。从cppreference

在模板之外,完全检查丢弃的语句。if constexpr不能替代#if预处理指令。

这意味着块中的每个分支都if constexpr必须是有效的 C++,即使它永远不会被使用。

于 2019-10-09T09:19:18.397 回答
-1

正如您所观察到的,您不能xif constexpr子句中包含类似代码行的“垃圾代码”。

if constexpr拥有而不是的#if主要优点if constexpr是能够以预处理器无法做到的方式推理类型。这种优势经常在模板中得到利用。

例如,您可以执行以下操作:

template <typename T>
T squareOnlyInt(T num) {
    if constexpr (std::is_same<T,int>::value) {
      return num * num;
    }
    else {
      return num;
    }
}
于 2021-03-07T22:14:26.593 回答