C++ 如果条件导致错误,则比较constexpr中的constexpr函数参数
我试图比较constexpr if语句中的函数参数 下面是一个简单的例子: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 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