描述编译时已知的“consteval”函数参数的名称,但 constexpr 不知道

2024-03-25

论证consteval函数是:

  • sort of 编译时已知
  • but is not 常量表达式

安德鲁·萨顿(Andrew Sutton)在他的论文中解释了这种行为背后的动机翻译和评估:编译时元编程的思维模型 http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2018/p0992r0.pdf,如所指出的这个帖子 https://stackoverflow.com/a/57226813/2085626.


您可以从 a 返回参数consteval函数并将其用作constexpr:

consteval int foo(int n) {
    return n;
}

constexpr int i = foo(9);

但你不能用它作为constexpr在 - 的里面consteval函数本身:

// fails to compile
consteval int abs(int n) {
    if constexpr (n < 0) {
        return -n;
    }
    else {
        return n;
    }
}

上面无法编译,如n is not a constexpr.

您当然可以使用一个简单的 if,它将在编译时进行评估:

// compiles
consteval int abs(int n) {
    if (n < 0) {
        return -n;
    }
    else {
        return n;
    }
}

constexpr int i = -9;
constexpr int num = abs(i);

这是一个术语问题:

有没有一个常用的名字编译时已知, but 不是一个常量表达式?


TL;DR:不,C++ 标准中没有这样的术语。

就标准而言,“编译时已知”并不是一回事。有“常量表达式”的概念,也有“常量求值”的概念。

constexpr 函数(用以下方式声明的函数constexpr or consteval) 可以在常量表达式上下文中调用。常量表达式上下文是语言运行的地方requires表达式为常量表达式。模板参数、初始化器constexpr/constinit变量等是常量表达式上下文。

当在常量表达式上下文中调用 constexpr 函数时,它们会生成常量表达式...或者您没有正确构造函数/参数并收到编译错误。就标准而言,差不多就是这样。

哦,是的,有关于 constexpr 函数的规则。他们被禁止执行某些 C++ 操作。并且有从常量表达式上下文调用它们的规则。但除此之外,就是这样。

您所指的区别仅仅是 constexpr 函数中允许的结果。您可以返回 constexpr 函数的参数,因为 constexpr 函数的返回值在语法上不是常量表达式。在适当的情况下,该功能可以进行不断的评估,但这就是标准需要说明的关于该主题的所有内容。

参数itself对于 C++ 来说并不特殊。特殊之处在于函数的定义是什么(即:你的函数是符合 constexpr 规则有效 https://timsong-cpp.github.io/cppwp/dcl.constexpr#3,这个评估是否做非constexpr事物 https://timsong-cpp.github.io/cppwp/expr.const#5),如何调用函数(即:您是否在常量表达式上下文中调用它),以及如何填充参数(即:参数是否为常量表达式)。

根据标准,有些表达式是常量表达式,有些表达式不是。但是,其值是通过常量表达式求值生成的,但本身不是语言常量表达式的表达式并不是标准的概念needs界定。它们只是价值观;它们是否处于常量表达式求值中与程序的行为并不真正相关。

所以这些东西没有名字。

立即函数(用以下函数声明的函数)consteval) 只是一个 constexpr 函数,其中包含一些额外的规则。这些规则阻止你泄漏立即函数的地址 https://timsong-cpp.github.io/cppwp/expr.const#11.2(即:编译器不必为它们生成真正的函数)。标准规定调用立即函数is always常量表达式上下文 https://timsong-cpp.github.io/cppwp/expr.const#14(因此必须根据这些规则调用)。

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

描述编译时已知的“consteval”函数参数的名称,但 constexpr 不知道 的相关文章

  • 如何获取正在访问 ASP.NET 应用程序的当前用户?

    为了获取系统中当前登录的用户 我使用以下代码 string opl System Security Principal WindowsIdentity GetCurrent Name ToString 我正在开发一个 ASP NET 应用程
  • 编译时运算符

    有人可以列出 C 中可用的所有编译时运算符吗 C 中有两个运算符 无论操作数如何 它们的结果始终可以在编译时确定 它们是sizeof 1 and 2 当然 其他运算符的许多特殊用途可以在编译时解决 例如标准中列出的那些整数常量表达式 1 与
  • 如何使用 C# 中的参数将用户重定向到 paypal

    如果我有像下面这样的简单表格 我可以用它来将用户重定向到 PayPal 以完成付款
  • 以文化中立的方式将字符串拆分为单词

    我提出了下面的方法 旨在将可变长度的文本拆分为单词数组 以进行进一步的全文索引处理 删除停止词 然后进行词干分析 结果似乎不错 但我想听听关于这种实现对于不同语言的文本的可靠性的意见 您会建议使用正则表达式来代替吗 请注意 我选择不使用 S
  • 在结构中使用 typedef 枚举并避免类型混合警告

    我正在使用 C99 我的编译器是 IAR Embedded workbench 但我认为这个问题对于其他一些编译器也有效 我有一个 typedef 枚举 其中包含一些项目 并且我向该新类型的结构添加了一个元素 typedef enum fo
  • ASP.NET MVC:这个业务逻辑应该放在哪里?

    我正在开发我的第一个真正的 MVC 应用程序 并尝试遵循一般的 OOP 最佳实践 我正在将控制器中的一些简单业务逻辑重构到我的域模型中 我最近一直在阅读一些内容 很明显我应该将逻辑放在域模型实体类中的某个位置 以避免出现 贫血域模型 反模式
  • 查找c中结构元素的偏移量

    struct a struct b int i float j x struct c int k float l y z 谁能解释一下如何找到偏移量int k这样我们就可以找到地址int i Use offsetof 找到从开始处的偏移量z
  • 嵌套接口:将 IDictionary> 转换为 IDictionary>?

    我认为投射一个相当简单IDictionary
  • 如何从 appsettings.json 文件中的对象数组读取值

    我的 appsettings json 文件 StudentBirthdays Anne 01 11 2000 Peter 29 07 2001 Jane 15 10 2001 John Not Mentioned 我有一个单独的配置类 p
  • 带动态元素的 WPF 启动屏幕。如何?

    我是 WPF 新手 我需要一些帮助 我有一个加载缓慢的 WPF 应用程序 因此我显示启动屏幕作为权宜之计 但是 我希望能够在每次运行时更改屏幕 并在文本区域中显示不同的引言 这是一个生产力应用程序 所以我将使用非愚蠢但激励性的引言 当然 如
  • 将多个表映射到实体框架中的单个实体类

    我正在开发一个旧数据库 该数据库有 2 个具有 1 1 关系的表 目前 我为每个定义的表定义了一种类型 1Test 1Result 我想将这些特定的表合并到一个类中 当前的类型如下所示 public class Result public
  • 使用 Bearer Token 访问 IdentityServer4 上受保护的 API

    我试图寻找此问题的解决方案 但尚未找到正确的搜索文本 我的问题是 如何配置我的 IdentityServer 以便它也可以接受 授权带有 BearerTokens 的 Api 请求 我已经配置并运行了 IdentityServer4 我还在
  • 覆盖子类中的字段或属性

    我有一个抽象基类 我想声明一个字段或属性 该字段或属性在从该父类继承的每个类中具有不同的值 我想在基类中定义它 以便我可以在基类方法中引用它 例如覆盖 ToString 来表示 此对象的类型为 property field 我有三种方法可以
  • 链接器错误:已定义

    我尝试在 Microsoft Visual Studio 2012 中编译我的 Visual C 项目 使用 MFC 但出现以下错误 error LNK2005 void cdecl operator new unsigned int 2
  • 如何使用 C# / .Net 将文件列表从 AWS S3 下载到我的设备?

    我希望下载存储在 S3 中的多个图像 但目前如果我只能下载一个就足够了 我有对象路径的信息 当我运行以下代码时 出现此错误 遇到错误 消息 读取对象时 访问被拒绝 我首先做一个亚马逊S3客户端基于我的密钥和访问配置的对象连接到服务器 然后创
  • 对现有视频添加水印

    我正在寻找一种用 C 在视频上加水印的方法 就像在上面写文字一样 图片或文字标签 我该怎么做 谢谢 您可以使用 Nreco 视频转换器 代码看起来像 NReco VideoConverter FFMpegConverter wrap new
  • WPF/C# 将自定义对象列表数据绑定到列表框?

    我在将自定义对象列表的数据绑定到ListBox in WPF 这是自定义对象 public class FileItem public string Name get set public string Path get set 这是列表
  • 为什么编译时浮点计算可能不会得到与运行时计算相同的结果?

    In the speaker mentioned Compile time floating point calculations might not have the same results as runtime calculation
  • C# 成员变量继承

    我对 C 有点陌生 但我在编程方面有相当广泛的背景 我想做的事情 为游戏定义不同的 MapTiles 我已经像这样定义了 MapTile 基类 public class MapTile public Texture2D texture pu
  • IEnumreable 动态和 lambda

    我想在 a 上使用 lambda 表达式IEnumerable

随机推荐