C++ 如果条件导致错误,则比较constexpr中的constexpr函数参数

C++ 如果条件导致错误,则比较constexpr中的constexpr函数参数,c++,constexpr,c++17,static-assert,if-constexpr,C++,Constexpr,C++17,Static Assert,If 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 boo

我试图比较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\u int

constexpr bool test_int_no_if(const int i) { return (i == 5); }
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版本无法编译,特别是因为静态断言工作得很好

如果您对此有任何建议,我们将不胜感激

谢谢

来自:

在constexpr if语句中,条件的值必须是 bool类型的上下文转换的常量表达式

然后,从:

定义可在编译时计算的表达式

显然,
i==5
不是一个常量表达式,因为
i
是在运行时计算的函数参数。这就是编译器抱怨的原因

使用函数时:

constexpr bool test_int_no_if(const int i) { return (i == 5); }
constexpr bool test_int_no_if(const int i) { return (i == 5); }
然后,它可能会在编译时进行计算,这取决于它的参数在编译时是否已知

如果
i
的定义如下:

constexpr int i = 5;
然后,在编译期间,
i
的值是已知的,如果在编译期间也可以对
进行评估,则可以在
static\u assert
内部调用它

还要注意,将函数参数标记为
const
并不会使其成为编译时常量。这只意味着您无法更改函数内的参数。

来自:

在constexpr if语句中,条件的值必须是 bool类型的上下文转换的常量表达式

然后,从:

定义可在编译时计算的表达式

显然,
i==5
不是一个常量表达式,因为
i
是在运行时计算的函数参数。这就是编译器抱怨的原因

使用函数时:

constexpr bool test_int_no_if(const int i) { return (i == 5); }
constexpr bool test_int_no_if(const int i) { return (i == 5); }
然后,它可能会在编译时进行计算,这取决于它的参数在编译时是否已知

如果
i
的定义如下:

constexpr int i = 5;
然后,在编译期间,
i
的值是已知的,如果在编译期间也可以对
进行评估,则可以在
static\u assert
内部调用它


还要注意,将函数参数标记为
const
并不会使其成为编译时常量。这只是意味着您无法更改函数内的参数。

可以使用非constexpr参数调用constexpr函数,在这种情况下,它的行为与普通函数类似,因此代码必须像编译非constexpr一样进行编译


简言之,如果这取决于i是constexpr,那么test_int_no_中没有任何内容,而test_int()中则有。(“constexpr if”仅适用于编译时表达式。)

可以使用非constexpr参数调用constexpr函数,在这种情况下,它的行为类似于普通函数,因此代码仍必须像编译非constexpr一样编译


简言之,如果这取决于i是constexpr,那么test_int_no_中没有任何内容,而test_int()中则有。(“constexpr if”仅适用于编译时表达式。)

为什么constexpr(i==5)而不仅仅是i==5?为什么这么复杂?为什么不返回i==5?为什么constexpr(i==5)而不仅仅是i==5?为什么这么复杂?为什么不返回i==5?这是最有用的答案imhot这是最有用的答案IMHO