constexpr 函数何时在编译时进行求值?

2024-04-04

既然声明为 constexpr 的函数有可能在运行时被调用,那么编译器根据什么标准决定是在编译时还是在运行时计算它呢?

template<typename base_t, typename expo_t>
constexpr base_t POW(base_t base, expo_t expo)
{
    return (expo != 0 )? base * POW(base, expo -1) : 1;
}

int main(int argc, char** argv)
{
    int i = 0;
    std::cin >> i;

    std::cout << POW(i, 2) << std::endl;
    return 0;
}

在这种情况下, i 在编译时是未知的,这可能就是编译器将 POW() 视为在运行时调用的常规函数​​的原因。然而,这种动态虽然看起来很方便,但却具有一些不切实际的含义。例如,是否可能存在这样的情况:我希望编译器在编译时计算 constexpr 函数,而编译器决定将其视为普通函数,而它也可以在编译时运行?是否有任何已知的常见陷阱?


constexpr功能will当它的所有参数都是常量表达式时,在编译时求值,并且结果也用在常量表达式中。常量表达式可以是文字(例如42),一个非类型模板参数(比如N in template<class T, size_t N> class array;), an enum元素声明(如Blue in enum Color { Red, Blue, Green };,声明另一个变量常量表达式, 等等。

They might当所有参数都是常量表达式时进行求值,结果为not在常量表达式中使用,但这取决于实现。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

constexpr 函数何时在编译时进行求值? 的相关文章

随机推荐

  • 具有集群和自定义视图标记的 Google 地图在放大和缩小时滞后太多

    我要加载GoogleMap用自定义视图代替GMSMarker并想展示聚类 我已经做到了 但我在放大或缩小地图时面临着滞后和内存使用情况 我已加载自定义视图GMSMarker信息视图 这是我的代码 class InitialMapViewCo
  • 使用 3d 变换矩阵

    在人工智能课程中 我们有一个机器人 它的手臂有 7 个关节 每个关节可以向不同的方向旋转 我需要知道最后的结局在哪里 我一直在尝试进行 3d 矩阵乘法 它适用于一个关节 但一旦我添加另一个关节 它就与我使用 Java3D api 制作的模型
  • 有没有办法直接访问 CSS 网格中自动放置元素的实际网格坐标?

    还有人问了类似的问题here https stackoverflow com questions 51327802 how to get the grid coordinates of an element using javascript
  • R 取子集后得到数据框的原始索引

    子集化后是否可以获取数据框的原始索引 它存储在某个地方 但我不确定在哪里以及如何访问它 我知道如果这是算法设计的一部分 会有更好的解决方案 我只是好奇是否有人知道是否可能 示例场景 df data frame atr1 integer at
  • 保留元素的排序列表,按该元素外部的属性排序

    我有一个 管理器 类维护对象列表 每个对象都有一定的 位置 但他们不知道这一点 只有管理者知道这一点 管理器必须为每个对象分配一个位置 并维护根据此 外部属性 排序的对象列表 请注意 对象的位置可以随时更改 理想情况下 我应该能够立即获取位
  • 在JavaScript中获取两个日期之间的年、月、日差异[重复]

    这个问题在这里已经有答案了 好吧 我在这里发现了很多类似的问题 试图获取两个日期之间的年 月和日的差异 但没有答案可以满足我的要求 所以我写了一些东西来计算 它似乎有效 但也许这里的一些专家可以进行更正或帮助使这更简单 您可以使用momen
  • Magento 高级配置文件导出 - 将 URL 添加到 IMAGE 路径

    刚使用 Magento 几周 就成功地使用了高级导出配置文件 非常方便 我想做的是将 url 值添加到输出列之一 特别是图像 url 我想将 url 附加到路径输出的开头 有人可以帮忙吗
  • 可空字段在写入 Spark Dataframe 时发生更改

    以下代码从 parquet 文件读取 Spark DataFrame 并写入另一个 parquet 文件 将 DataFrame 写入新的 Parquet 文件后 ArrayType 中的 Nullable 字段的 DataType 会发生
  • DAO.Recordset、DAO.Recordsets、DAO.Recordset2 之间的差异

    谁能解释一下之间的区别DAO Recordset DAO Recordsets and DAO Recordset2在 MS Access 2007 中 基本上使用记录集 给出一个例子 以便更清楚 我从帮助选项中找到了一些参考资料 但我不清
  • 为什么我的查询只显示一个结果?

    为什么我从下面的查询中只得到一个结果 建议的 答案 的名字是 Susan 而不是我在结果中得到的名字 SELECT EmpFirstName EmpLastName p ProductName as ProductName YEAR c O
  • 分割功能 - 避免最后一个空白空间

    我对如何使用 split 功能有疑问 str James Joseph Arun str split 我得到了结果 James Joseph Arun 我需要输出为 James Joseph Arun 最好的方法是什么 要删除所有空字符串
  • Mongo数据库保存Map中的数据

    我有以下有效的代码 if aDBCursor hasNext DBObject aDbObject aDBCursor next aDbObject put title Test Title ArrayList
  • 如何仅以编程方式禁用我的应用程序的移动数据

    我正在开发一个应用程序 我担心用户之间可以传输的数据量 由于一些用户的移动数据计划有限 而另一些则没有 我想知道是否可以开发一个开关来禁用我的特定应用程序的移动数据 有点像Android自己的数据使用 gt 移动 gt 应用程序 gt 限制
  • Typescript - 逐步扩展对象的类型

    我试图通过 TS 实现以下目标 let m Extendable m add one 1 m now has one field m add two 2 m now has one and two fields 我熟悉通过以下方式在 TS
  • Python - 在特定长度的文件中查找字符串,并且该字符串必须是大写字母和数字

    我想找到一个特定长度的字符串 例如 7 个字符 该字符串只能包含大写字母和数字 我有想法 逐行读取文件 我不确定这里的最佳实践是在一个块中读取整个文件还是使用循环逐行读取文件 必须使用循环逐行读取文件吗 read lines in text
  • GA 中的排名选择?

    我已经实施了Roulette wheel selection in GA TotalFitness sum Fitness ProbSelection zeros PopLength 1 CumProb zeros PopLength 1
  • matlab数据文件到pandas DataFrame [重复]

    这个问题在这里已经有答案了 有没有标准的转换方法matlab mat matlab格式数据 文件到PandaDataFrame 我知道可以通过使用解决方法scipy io但我想知道是否有一种简单的方法可以做到这一点 我找到了两种方法 sci
  • 在垂直和水平步进材料之间切换

    如何切换垫子垂直步进器 and 矩阵水平步进器来自具有相同步进步骤的角度分量 为了避免重写相同的 html 内容 请这样做 创建模板并使用 hashtag 然后你可以使用插入它们ng container ngTemplateOutlet h
  • Android 6.0 Marshmallow:片段动画出现奇怪的错误

    我在应用商店中的一个应用程序在 Android 5 0 上运行得非常好 但自从今天我将我的设备升级到 6 0 后 我遇到了奇怪的错误 我将其范围缩小到片段过渡动画 ftrans setCustomAnimations inAnim outA
  • constexpr 函数何时在编译时进行求值?

    既然声明为 constexpr 的函数有可能在运行时被调用 那么编译器根据什么标准决定是在编译时还是在运行时计算它呢 template