c++ - 在这个例子中如何理解 constexpr?
问题描述
我试图理解 constexpr 应用于函数时的含义。在下面的示例中,程序编译并运行,但我不明白如何在编译时推导出函数 sum(int n),因为直到运行时才知道 n。我正在使用带有最新更新的 VS 2017。
无论是否包含 constexpr,程序都会编译。
#include <iostream>
constexpr int sum(int n)
{
return (n <= 0) ? 0 : n + sum(n-1);
}
int main()
{
int i;
std::cin >> i;
std::cout << sum(i) << std::endl;
return 0;
}
我希望编译器会出错 sum(int n) 不是常量表达式。或者 constepxr 只是像“内联”这样对编译器的提示,可以随意忽略?
解决方案
我希望编译器会出错 sum(int n) 不是常量表达式。
constexpr int sum(int n);
意味着可以在编译时评估该函数。它不一定是。您可以在运行时调用它而不会出现任何问题,这在程序员在运行时和编译时需要相同功能时不强制重复代码是有意义的。
使用 C++20,您将能够通过使用 new 关键字consteval
而不是constexpr
.
consteval int sum(int n)
{
// As before...
}
int i;
// determine i at runtime...
sum(i); // Error! Not evaluated at compile time.
您可以查看P1073的此功能。该提案已被批准用于下一标准。
推荐阅读
- angularjs - 后退按钮不适用于向下钻取饼图
- r - 将 ID 应用于 taglist 中的 renderDT()
- xcode - Xcode 源代码控制提交窗口显示没有文件
- c# - 在没有 Javascript 的 Cefsharp 中模拟真实的鼠标移动和键盘
- javascript - 如果我用 js 设置一个值并使用阻止默认值,则该值在 c# 中不存在
- elasticsearch - 在对象数组中查找具有至少一个空值的文档
- php - 多次单击提交按钮后出现重复问题
- python - 我需要帮助在不使用 importmath、python 的情况下获取 stdev
- excel - 动态数组中何时需要 ReDim?
- java - 使用 findAll 意外结束子树