c-如果条件导致错误,则在constexpr中比较constexpr函数参数

我正在尝试比较constexpr-if语句中的函数参数.

这是一个简单的示例:

constexpr bool test_int(const int i) {
  if constexpr(i == 5) { return true; }
 else { return false; }
}

但是,当我使用带有以下标志的GCC 7进行编译时:
g -7 -std = c 1z test.cpp -o test
我收到以下错误消息:

test.cpp: In function 'constexpr bool test_int(int)':
test.cpp:3:21: error: 'i' is not a constant expression
 if constexpr(i == 5) { return true; }

但是,如果我用其他函数替换test_int:

constexpr bool test_int_no_if(const int i) { return (i == 5); }

然后,以下代码编译无误:

int main() {
  constexpr int i = 5;
  static_assert(test_int_no_if(i));
  return 0;
}

我不明白为什么constexpr-if版本无法编译,特别是因为static_assert可以正常工作.

任何建议,将不胜感激.

谢谢!

解决方法:

constexpr if开始:

In a constexpr if statement, the value of condition must be a
contextually converted constant expression of type bool.

然后,从constant expression开始:

Defines an expression that can be evaluated at compile time.

显然,i == 5不是常数表达式,因为i是在运行时评估的函数参数.这就是编译器抱怨的原因.

使用函数时:

constexpr bool test_int_no_if(const int i) { return (i == 5); }

那么可能会在编译期间对其进行评估,具体取决于其参数在编译时是否已知.

如果我定义如下:

constexpr int i = 5;

那么i的值在编译期间是已知的,并且test_int_no_if可能在编译期间求值,也可以在static_assert内部调用它.

还要注意,将函数参数标记为const并不能使其成为编译时间常数.这仅表示您无法在函数内部更改参数.

上一篇:计算机速成课 第九集 高级CPU设计


下一篇:c-尽管存在显式实例化,但类模板的成员函数模板找不到定义.不连结