在constexpr-if条件下比较constexpr函数参数会导致错误

问题描述:

我试图比较一个constexpr-if语句中的函数参数。在constexpr-if条件下比较constexpr函数参数会导致错误

下面是一个简单的例子:

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

然而,当我用下面的标志编译这个海湾合作委员会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,如果版本编译失败,特别是因为static_assert工作得很好。

任何意见,将不胜感激。

谢谢!

+2

为什么constexpr(i == 5)而不只是我== 5? – deW1

+0

任何为什么这么复杂?为什么不返回我== 5? – deW1

constexpr if

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

然后,从constant expression

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

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

当您使用功能:

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

那么可以在编译时间取决于它是否是参数在编译时知道或不进行评估。

如果i的定义如下:

constexpr int i = 5; 

那么i值在编译时已知和test_int_no_if可能在编译过使它可以调用它里面static_assert进行评估。

另请注意,标记函数参数const不会使其成为编译时间常量。这只是意味着你不能改变函数内部的参数。

一个constexpr函数可以用非constexpr参数调用,在这种情况下,它的行为就像一个普通函数,所以代码仍然必须编译,就好像它不是constexpr。

简而言之,test_int_no_if中没有任何内容取决于我是否是constexpr,而在test_int()中则有。 (“constexpr if”仅适用于编译时表达式。)