gpt4 book ai didi

c++ - 功能的条件评估

转载 作者:太空狗 更新时间:2023-10-29 20:12:43 25 4
gpt4 key购买 nike

好吧,这可能是个愚蠢的问题,但我完全不明白第 12.1.6.2 章 - c++ 编程语言的 constexpr 函数下的条件求值。这是整个非常短的文本。

A branch of a conditional expression that is not taken in a constexpr function is not evaluated. This implies that a branch not taken can require run-time evaluation. For example:

constexpr int check(int i)
{
return (low<=i && i<high) ? i : throw out_of_range();
}

constexpr int low = 0;
constexpr int high = 99;

// ...
constexpr int val = check(f(x,y,z));

You might imagine low and high to be configuration parameters that are known at compile time, but not at design time, and that f(x,y,z) computes some implementation-dependent value.

Source for context

我尝试运行上面的代码以尝试更多地理解解释,但我遇到了错误。有人可以提供更清楚的解释吗?

编辑:我创建了一个程序来测试这个:

#include<iostream>
#include<stdexcept>

using namespace std;

constexpr int low = 0;
constexpr int high = 99;

constexpr int check(int i) {
return (low<=i && i<high) ? i : throw out_of_range();
}

constexpr int f(int x, int y, int z) {
return x*y*z;
}

int main() {
constexpr int val = check(f(2,2,2));
cout << val << '\n';
}

它不会运行:

no matching function for call to 'std::out_of_range::out_of_range()' //I'm really surprised at this
return (low<=i && i<high) ? i : throw out_of_range();
error: body of constexpr function 'constexpr int check(int)' not a return-statement
}
error: 'constexpr int check(int)' called in a constant expression
constexpr int val = check(f(2,2,2));

最佳答案

这意味着 constexpr 函数中的条件分支允许使用非常量表达式(即需要运行时评估的表达式,例如抛出异常),只要在常量表达式上下文。

所以调用check就可以了初始化 constexpr变量 val , 只要函数的参数是常量表达式,并且条件 (low<=i && i<high)是真的。

如果参数不是常量,则函数调用不是常量表达式,因此无法初始化 constexpr变量。

如果条件为假,函数需要采取 false 分支,这需要抛出异常,这需要运行时评估,所以函数不是常量表达式,因此不能初始化 constexpr。变量。

当参数是一个常量表达式时,编译器在编译时就知道是否会进行分支,所以只要条件是true即可。它可以完全忽略 false分支,并且不会提示在编译时抛出异常是不可能的。

当函数在运行时被调用时,它可以有任何参数,false可以采取分支和throw将作为普通(非 constexpr)函数进行评估。

关于c++ - 功能的条件评估,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26125441/

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