使用 constexpr 代替 consteval 函数有哪些优点?

Dan*_*saf 1 c++ c++20 consteval

这可能看起来与使用 consteval 而不是 constexpr 函数的优点是什么相同的问题? 但实际上恰恰相反:

现在我们有了 C++20 consteval,在什么(现实)场景中我仍然需要/创建 constexpr 函数而不是 consteval 函数(或普通函数)?

我知道 constexpr 函数也可以使用在运行时评估的参数来调用,这与 consteval 函数不同(请参阅示例代码中的 ***),但为什么我需要它呢?我的意思是我也可以使用普通函数。

int FunNormal()
{
    return 12345;
}    

consteval int FunConstEval(int p)
{
    return p+3;
}    

constexpr int FunConstExpr(int p)
{
    return p+3;
}    
    

int main() 
{
    // FunConstEval(FunNormal());               // illegal
    FunConstExpr(FunNormal());                  // legal, but why would I ever want to do this? ***
    
//    constexpr int a1 = FunNormal();           // illegal, obviously
//    constexpr int a1 = FunConstExpr(FunNormal());     // illegal
    constexpr int a2 = FunConstEval(1);     
    constexpr int a3 = FunConstExpr(1);     
}
Run Code Online (Sandbox Code Playgroud)

Jan*_*tke 5

FunConstExpr(FunNormal()); // legal, but why would I ever want to do this?
Run Code Online (Sandbox Code Playgroud)

FunNormal可能是一个从用户输入或编译时不可用的其他源获取其值的函数。正如评论者指出的那样,constexpr函数可以让您执行以下操作:

std::cin >> x;
std::cout << FunConstExpr(x);
Run Code Online (Sandbox Code Playgroud)

没有充分的理由人为地将函数限制为在编译时运行,除非它在运行时无法实现。

consteval应该只用于必须在编译时评估的东西。C++ 标准库中的一些示例是:

这些例子都是相当罕见和不寻常的。绝大多数功能应该是constexpr,但不是consteval

  • @DanRechtsaf,但是如果您在编译时和运行时(例如在不同的代码部分)中(可能)需要相同的逻辑 - 为什么您应该有2个单独的函数?这就是 `constexpr` 的用途。 (4认同)