描述编译时已知的“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 不知道 的相关文章

  • 如何从该 Voronoi 图数据中获取单元格字典?

    使用找到的voronoi delaunay图生成库在这个节目中 http sourceforge net projects mapmanager 这是基于 财富 最初的实施他的算法 http en wikipedia org wiki Fo
  • VSTS 构建失败/发布无法在 bin 文件夹中找到 roslyn\csc.exe

    我们有一个网站项目 安装了以下 nuget 软件包 Microsoft CodeDom Providers DotNetCompilerPlatform 1 0 8 Microsoft Net Compilers 2 4 0 The web
  • MVC Core IActionResult 含义

    什么是IActionResult 我尝试查看 MSDN 和其他网站 但需要通用 常见 易于理解的答案 MSDN IActionResult https learn microsoft com en us dotnet api microso
  • 中间件 API 的最佳实践是什么? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我们正在开发一个中间件 SDK 采用 C 和 Java 语言 供游戏开发人员 动画软件开发人员 阿凡达开
  • gtest 和 gmock 有什么区别?

    我试图理解的目的google mock Google 的 C 模拟框架 https github com google googletest blob master googlemock README md 我已经与gtest较早 但我还是
  • CMake 和 Visual Studio:如何获得快速、安静的命令行构建?

    我有一个 cmake 项目 它成功地完成了我想要的一切 但我有大约 100 个文件 当我只需要重新编译一个文件时 我厌倦了每次看到生成的巨大输出 每个文件 30 行 明确地说 我正在编译cmake build 得到这个结果 我需要传递给编译
  • 避免集合已修改错误

    Issue 我有以下代码 foreach var ItemA in GenericListInstanceB ItemA MethodThatCouldRemoveAnyItemInGenericListInstanceB 显然我得到一个错
  • C++ 非类型参数包扩展

    我正在编写由单一类型参数化的模板函数 并且具有可变数量的相同类型 而不是不同类型 的参数 它应该检查第一个值是否在其余值中 我想这样写 include
  • 如何从 List 中的字符串中删除数字/数字?

    我有一个字符串列表 List
  • 使用 Selenium for C# 登录 Facebook

    我一直在使用 Selenium C 框架并尝试进行 facebook 登录 但没有任何运气 这是我到目前为止得到的 基于这篇文章 使用 Selenium 测试 Facebook Connect 应用程序 https stackoverflo
  • 以标准用户身份打开默认浏览器 (C++)

    我目前正在使用 ShellExecute 打开 在用户浏览器中打开 URL 但在 Win7 和 Vista 中遇到了一些麻烦 因为该程序作为服务运行提升 当 ShellExecute 打开浏览器时 它似乎读取 本地管理员 配置文件而不是用户
  • 如何附加到 xml

    我有这个xml
  • Qt:将拖放委托给子级的最佳方式

    我在 QWidget 上使用拖放 我重新实现了 DragEnterEvent dragLeaveEvent dragMoveEvent 和 dropEvent 效果很好 在我的 QWidget 中 我有其他 QWidget 子级 我希望它们
  • 如何解释“错误C2018:未知字符'0x40'?[关闭]

    Closed 这个问题需要调试细节 help minimal reproducible example 目前不接受答案 在编译一些代码时 我收到以下信息 错误 C2018 未知字符 0x40 我想知道如何解决这样的问题 这是我要开始的地方
  • 我应该使用多个 HttpClient 来进行批量异步 GET 请求吗?

    我有一个场景 我需要在尽可能短的时间内发出大量 GET 请求 想想大约 1000 个 我知道通常最好保留一个客户端并尽可能重用它 Create Single HTTP Client HttpClient client new HttpCli
  • 使用 roslyn 扩展 C# 语法

    我试图在没有 else 情况的情况下实现 return if return value if 因为我只想在条件有效时返回或返回一个值 我知道 有if condition return or if condition return value
  • 实体框架代理创建

    我们可以通过使用来停止在上下文构造函数中创建代理 this Configuration ProxyCreationEnabled false 在 EF 4 1 中创建代理有哪些优点和缺点 代理对于两个功能是必需的 延迟加载 导航属性在第一次
  • 将小数格式化为两位或整数

    对于 10 我想要 10 而不是 10 00 对于 10 11 我想要 10 11 没有代码可以实现吗 即通过指定格式字符串类似于 0 N2 decimal num 10 11M Console WriteLine num ToString
  • 在类中使用 std::chrono::high_resolution_clock 播种 std::mt19937 的正确方法是什么?

    首先 大家好 这是我在这里提出的第一个问题 所以我希望我没有搞砸 在写这篇文章之前我用谷歌搜索了很多 我对编码 C 很陌生 我正在自学 考虑到有人告诉我 只为任何随机引擎播种一次是一个很好的做法 我在这里可能是错的 什么是正确 最佳 更有效
  • 什么时候使用静态库需要头文件?

    如果我在 Linux 中用 C 创建一个静态库并生成 a 文件 我 或其他人 如何使用该库 例如 我的库定义了一个类 我认为仅仅提供 a 文件是不够的 还需要提供头文件 我如何知道 a 文件必须提供哪些头文件 例如 我是否需要提供我的库代码

随机推荐