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)
Run Code Online (Sandbox Code Playgroud)FunConstExpr(FunNormal()); // legal, but why would I ever want to do this?
FunNormal可能是一个从用户输入或编译时不可用的其他源获取其值的函数。正如评论者指出的那样,constexpr函数可以让您执行以下操作:
std::cin >> x;
std::cout << FunConstExpr(x);
Run Code Online (Sandbox Code Playgroud)
没有充分的理由人为地将函数限制为仅在编译时运行,除非它在运行时无法实现。
consteval应该只用于必须在编译时评估的东西。C++ 标准库中的一些示例是:
std::source_location::current- 运行时无法获取源文件中的位置std::is_within_lifetime- 对象的生命周期只有在常量表达式中才能可靠地知道std::basic_format_string构造函数- 要对 的参数进行类型检查std::format,格式字符串必须是常量表达式这些例子都是相当罕见和不寻常的。绝大多数功能应该是constexpr,但不是consteval。
| 归档时间: |
|
| 查看次数: |
285 次 |
| 最近记录: |