gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 10:32:57 25 4
gpt4 key购买 nike

我正在尝试比较 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); }

那么它可能会在编译时进行评估,具体取决于它的参数在编译时是否已知。

如果 i定义如下:
constexpr int i = 5;

那么 i 的值在编译期间是已知的, test_int_no_if也可以在编译期间进行评估,从而可以在 static_assert 内部调用它.

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

关于c++ - 在 constexpr-if 条件下比较 constexpr 函数参数会导致错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61620761/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com