如何理解“明显不断评估”的定义?

2024-03-04

P0595 https://wg21.link/P0595介绍了std::is_constant_evaluated()功能。本文讨论了在某些情况下,包含表达式是常量表达式,但编译器不需要在编译时计算的情况。给出的例子是:

constexpr double power(double b, int x) {
  if (std::is_constant_evaluated() && x >= 0) {
    // ...
    // return r;
  } else {
    // Let the code generator figure it out.
    return std::pow(b, (double)x);
  }
}

double thousand() {
  return power(10.0, 3);
}

编译器可能会评估power(10.0, 3)在编译时,但不是必需的。所以,is_constant_evaluated返回假。

因此本文引入了“明显不断评估”的概念:

我们的方法是精确识别一组“明显常量求值”(新技术短语)的表达式,并指定我们的新函数返回true在评估此类表达式和false否则。

具体来说,我们在“明显常量求值”的表达式集中包含两种表达式。第一种很简单:标准已经要求常量结果的上下文中的表达式,例如数组的维数或 constexpr 变量的初始值设定项。 ...

这对我来说很有意义。然而,标准中的实际措辞让我感到困惑:

表达式或转换e is 明显不断评估如果是:

  • a 常量表达式, or ...

换句话说,该标准规定所有常量表达式显然都是常量计算的,这(对我来说)似乎没有包含表达式出现在需要常量表达式的上下文中的要求。该提案指出power(10.0, 3)是一个核心常量表达式,这也是我的理解;这使它成为一个常量表达式。如果所有常量表达式显然都是常量计算的,那么看起来is_constant_evaluated此处必须返回 true。

我应该如何理解标准中的定义,使其具有与提案意图一致的准确含义?


This is my favorite. It doesn't say " a constant expression." It says "a constant-expression."

常量表达式是一个语法术语。它是 C++ 语法中强制使用常量表达式的地方的替代品。

例如,语法(具体来说,语法)模板参数 http://eel.is/c++draft/temp.names#nt:template-argument is 常量表达式 (or a type-id or an id-表达式),所以这条规则意味着当评估一个常量表达式显示为模板参数,该评估显然是持续评估的。

相比之下,语法中if constexpr does not take a 常量表达式, 它只是takes a 状况 http://eel.is/c++draft/stmt.select.general#nt:selection-statement。所以这颗子弹不足以覆盖if constexpr,这就是为什么有一个特殊的额外项目符号来涵盖“constexpr if 语句的条件”。


Imagine having to answer this question verbally. You can hear the hyphen, right?

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

如何理解“明显不断评估”的定义? 的相关文章

  • 使用 lambda 表达式注册类型

    我想知道如何在 UnityContainer 中实现这样的功能 container RegisterType
  • 计算 XML 中特定 XML 节点的数量

    请参阅此 XML
  • 使用 C# 登录《我的世界》

    我正在尝试为自己和一些朋友创建一个简单的自定义 Minecraft 启动器 我不需要启动 Minecraft 的代码 只需要登录的实际代码行 例如 据我所知 您过去可以使用 string netResponse httpGET https
  • 在c#中执行Redis控制台命令

    我需要从 Redis 控制台获取 客户端列表 输出以在我的 C 应用程序中使用 有没有办法使用 ConnectionMultiplexer 执行该命令 或者是否有内置方法可以查找该信息 CLIENT LIST是 服务器 命令 而不是 数据库
  • 为什么pow函数比简单运算慢?

    从我的一个朋友那里 我听说 pow 函数比简单地将底数乘以它的指数的等价函数要慢 例如 据他介绍 include
  • ComboBox DataBinding 导致 ArgumentException

    我的几个类对象 class Person public string Name get set public string Sex get set public int Age get set public override string
  • 如何判断计算机是否已重新启动?

    我曾经使用过一个命令行 SMTP 邮件程序 作为试用版的限制 它允许您在每个 Windows 会话中最多接收 10 封电子邮件 如果您重新启动计算机 您可能还会收到 10 个以上 我认为这种共享软件破坏非常巧妙 我想在我的应用程序中复制它
  • C# 数据表更新多行

    我如何使用数据表进行多次更新 我找到了这个更新 1 行 http support microsoft com kb 307587 my code public void ExportCSV string SQLSyntax string L
  • 对 std::vector 进行排序但忽略某个数字

    我有一个std vector
  • Python 属性和 Swig

    我正在尝试使用 swig 为一些 C 代码创建 python 绑定 我似乎遇到了一个问题 试图从我拥有的一些访问器函数创建 python 属性 方法如下 class Player public void entity Entity enti
  • 启动时的 Excel 加载项

    我正在使用 Visual C 创建 Microsoft Excel 的加载项 当我第一次创建解决方案时 它包含一个名为 ThisAddIn Startup 的函数 我在这个函数中添加了以下代码 private void ThisAddIn
  • 打破 ReadFile() 阻塞 - 命名管道 (Windows API)

    为了简化 这是一种命名管道服务器正在等待命名管道客户端写入管道的情况 使用 WriteFile 阻塞的 Windows API 是 ReadFile 服务器已创建启用阻塞的同步管道 无重叠 I O 客户端已连接 现在服务器正在等待一些数据
  • 使用valgrind进行GDB远程调试

    如果我使用远程调试gdb我连接到gdbserver using target remote host 2345 如果我使用 valgrind 和 gdb 调试内存错误 以中断无效内存访问 我会使用 target remote vgdb 启动
  • IQueryable 单元或集成测试

    我有一个 Web api 并且公开了一个端点 如下所示 api 假期 name name 这是 Web api 的控制器 get 方法 public IQueryable
  • 在视口中查找 WPF 控件

    Updated 这可能是一个简单或复杂的问题 但在 wpf 中 我有一个列表框 我用一个填充数据模板从列表中 有没有办法找出特定的数据模板项位于视口中 即我已滚动到其位置并且可以查看 目前我连接到了 listbox ScrollChange
  • 保护 APK 中的字符串

    我正在使用 Xamarin 的 Mono for Android 开发一个 Android 应用程序 我目前正在努力使用 Google Play API 添加应用内购买功能 为此 我需要从我的应用程序内向 Google 发送公共许可证密钥
  • WPF DataGridTemplateColumn 组合框更新所有行

    我有这个 XAML 它从 ItemSource 是枚举的组合框中选择一个值 我使用的教程是 http www c sharpcorner com uploadfile dpatra combobox in datagrid in wpf h
  • 我可以在“字节数”设置为零的情况下调用 memcpy() 和 memmove() 吗?

    当我实际上没有什么可以移动 复制的时候 我是否需要处理这些情况memmove memcpy 作为边缘情况 int numberOfBytes if numberOfBytes 0 memmove dest source numberOfBy
  • 为boost python编译的.so找不到模块

    我正在尝试将 C 代码包装到 python 中 只需一个类即可导出两个函数 我编译为map so 当我尝试时import map得到像噪音一样的错误 Traceback most recent call last File
  • 如何将十六进制字符串转换为无符号长整型?

    我有以下十六进制值 CString str str T FFF000 如何将其转换为unsigned long 您可以使用strtol作用于常规 C 字符串的函数 它使用指定的基数将字符串转换为 long long l strtol str

随机推荐