为什么在适用时不隐含 constexpr? [复制]

2024-03-19

这些可能应该在不同的问题中,但它们是相关的,所以......

  1. 为什么我们需要写constexpr根本吗?给定一组限制,编译器无法评估代码以查看它是否满足constexpr要求,并将其视为constexpr如果有的话?作为一个纯粹的文档关键字,我不确定它是否成立,因为我无法想到我(其他人的用户)的情况constexpr函数)应该真正关心它是否是运行时。

    这是我的逻辑:如果它是一个昂贵的函数,我认为作为良好实践的问题,我应该这样对待它,无论我是否给它编译时常量输入。这可能意味着在加载时调用它并保存结果,而不是在执行的关键点调用它。原因是因为constexpr实际上并不能向我保证它不会在运行时执行——所以也许一个新的/不同的机制应该做到这一点。

  2. The constexpr限制 http://en.cppreference.com/w/cpp/language/constexpr似乎排除许多(如果不是大多数)函数在编译时被评估,这在逻辑上是可能的。我读过这至少部分(或可能全部?)是为了防止无限循环和挂起编译器。但是,如果这是the理由,合法吗?

对于任何给定的情况,编译器不应该能够计算 ifconstexpr使用给定输入的函数会无限循环吗?这是not解决停止问题 https://en.wikipedia.org/wiki/Halting_problem for any输入。输入到一个constexpr函数是编译时常数并且是有限的,因此编译器只需检查有限输入集的无限循环:实际使用的输入。如果您编写编译时无限循环,这应该是常规编译错误。


我问了一个非常相似的问题,为什么我们需要将函数标记为 constexpr? https://stackoverflow.com/questions/14472359/why-do-we-need-to-mark-functions-as-constexpr

When 我按了 https://groups.google.com/a/isocpp.org/d/msg/std-discussion/nrAu_YbCbYM/0eQsx6ip1DwJClang 作者 Richard Smith 解释道:

constexpr 关键字确实有用。

它会影响函数模板特化的实例化时间(如果在未计算的上下文中调用 constexpr 函数模板特化,则可能需要实例化它们;对于非 constexpr 函数则不然,因为对函数模板的调用永远不可能成为常量的一部分表达)。如果我们删除了关键字的含义,我们就必须尽早实例化更多的专业化,以防万一调用恰好是一个常量表达式。

它通过限制实现在翻译期间尝试评估的函数调用集来减少编译时间。 (这对于需要实现尝试常量表达式求值的上下文很重要,但如果此类求值失败,这不是错误 - 特别是静态存储持续时间的对象的初始值设定项。)

这一切一开始似乎并不令人信服,但如果你仔细研究细节,事情就会在不经意间就解开。constexpr。函数在使用 ODR 之前不需要实例化,这本质上意味着在运行时使用。有什么特别之处constexpr函数的缺点是它们可能违反此规则并且无论如何都需要实例化。

函数实例化是一个递归过程。实例化函数会导致其使用的函数和类的实例化,而不管任何特定调用的参数如何。

如果在实例化此依赖树时出现问题(可能会付出巨大的代价),则很难接受该错误。此外,类模板实例化可能会产生运行时副作用。

给定函数签名中依赖于参数的编译时函数调用,重载决策可能会导致函数定义的实例化,这些函数定义仅辅助重载集中的函数定义,包括甚至不被调用的函数。此类实例化可能会产生副作用,包括格式错误和运行时行为。

当然,这是一个极端的情况,但如果你不要求人们选择加入,那么糟糕的事情可能会发生constexpr功能。

As for constexpr对象,某些类型可以产生核心常量表达式无需声明即可在常量表达式上下文中使用constexpr。但您并不真的希望编译器在编译时尝试评估每个表达式。这就是持续传播的目的。另一方面,记录某些事情似乎非常重要needs在编译时发生。

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

为什么在适用时不隐含 constexpr? [复制] 的相关文章

  • 在 C++ 中分割大文件

    我正在尝试编写一个程序 该程序接受一个大文件 任何类型 并将其分成许多较小的 块 我想我已经有了基本的想法 但由于某种原因我无法创建超过 12 kb 的块大小 我知道谷歌等上有一些解决方案 但我更感兴趣的是了解这个限制的根源是什么 然后实际
  • 获取两个字符串之间的公共部分c# [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我需要的是获取两个单词之间的共同部分并获取差异 例子 场景1 word1 感言 word2 Test 将返回 公共部分Test 不同之
  • Blazor 与 Razor

    随着 Blazor 的发明 我想知道这两种语言之间是否存在显着的效率 无论是在代码创建方面还是在代码的实际编译 执行方面 https github com SteveSanderson Blazor https github com Ste
  • try-catch 中未处理的异常

    try list from XElement e in d Descendants wix File where e Attribute Name Value Contains temp Name e Parent Parent Attri
  • std::map 和二叉搜索树

    我读过 std map 是使用二叉搜索树数据结构实现的 BST 是一种顺序数据结构 类似于数组中的元素 它将元素存储在 BST 节点中并按其顺序维护元素 例如如果元素小于节点 则将其存储在节点的左侧 如果元素大于节点 则将其存储在节点的右侧
  • TextBox 焦点的 WinForms 事件?

    我想添加一个偶数TextBox当它有焦点时 我知道我可以用一个简单的方法来做到这一点textbox1 Focus并检查布尔值 但我不想那样做 我想这样做 this tGID Focus new System EventHandler thi
  • C++11 函数局部静态 const 对象的线程安全初始化

    这个问题已在 C 98 上下文中提出 并在该上下文中得到回答 但没有明确说明有关 C 11 的内容 const some type create const thingy lock my lock some mutex static con
  • 是否有与 C++11 emplace/emplace_back 函数类似的 C# 函数?

    从 C 11 开始 可以写类似的东西 include
  • 单元测试失败,异常代码为 c0000005

    我正在尝试使用本机单元测试项目在 Visual Studios 2012 中创建单元测试 这是我的测试 TEST METHOD CalculationsRoundTests int result Calculations Round 1 0
  • 为什么 FTPWebRequest 或 WebRequest 通常不接受 /../ 路径?

    我正在尝试从 ftp Web 服务器自动执行一些上传 下载任务 当我通过客户端甚至通过 Firefox 连接到服务器时 为了访问我的目录 我必须指定如下路径 ftp ftpserver com AB00000 incoming files
  • C# using 语句、SQL 和 SqlConnection

    使用 using 语句 C SQL 可以吗 private static void CreateCommand string queryString string connectionString using SqlConnection c
  • 在 C 中复制两个相邻字节的最快方法是什么?

    好吧 让我们从最明显的解决方案开始 memcpy Ptr const char a b 2 调用库函数的开销相当大 编译器有时不会优化它 我不会依赖编译器优化 但即使 GCC 很聪明 如果我将程序移植到带有垃圾编译器的更奇特的平台上 我也不
  • gdb查找行号的内存地址

    假设我已将 gdb 附加到一个进程 并且在其内存布局中有一个文件和行号 我想要其内存地址 如何获取文件x中第n行的内存地址 这是在 Linux x86 上 gdb info line test c 56 Line 56 of test c
  • Fluent NHibernate 日期时间 UTC

    我想创建一个流畅的 nhibernate 映射来通过以下方式映射 DateTime 字段 保存时 保存 UTC 值 读取时 调整为本地时区值 实现此映射的最佳方法是什么 就我个人而言 我会将日期存储在 UTC 格式的对象中 然后在读 写时在
  • 如何在 GCC 5 中处理双 ABI?

    我尝试了解如何克服 GCC 5 中引入的双重 ABI 的问题 但是 我没能做到 这是一个重现错误的非常简单的示例 我使用的GCC版本是5 2 如您所见 我的主要函数 在 main cpp 文件中 非常简单 main cpp include
  • 过度使用委托对性能来说是一个坏主意吗? [复制]

    这个问题在这里已经有答案了 考虑以下代码 if IsDebuggingEnabled instance Log GetDetailedDebugInfo GetDetailedDebugInfo 可能是一个昂贵的方法 因此我们只想在调试模式
  • Azure函数版本2.0-应用程序blobTrigger不工作

    我有一个工作功能应用程序 它有一个 blob 输入和一个事件中心输出 在测试版中工作 随着最新的更改 我的功能不再起作用 我尝试根据发行说明更新 host json 文件 但它没有引用 blob 触发器 version 2 0 extens
  • 从类模板参数为 asm 生成唯一的字符串文字

    我有一个非常特殊的情况 我需要为类模板中声明的变量生成唯一的汇编程序名称 我需要该名称对于类模板的每个实例都是唯一的 并且我需要将其传递给asm关键字 see here https gcc gnu org onlinedocs gcc 12
  • 如何确定母版页中正在显示哪个子页?

    我正在母版页上编写代码 我需要知道正在显示哪个子 内容 页面 我怎样才能以编程方式做到这一点 我用这个 string pageName this ContentPlaceHolder1 Page GetType FullName 它以 AS
  • WPF/数据集:如何通过 XAML 将相关表中的数据绑定到数据网格列中?

    我正在使用 WPF DataSet 连接到 SQL Server Express XAML 和 C Visual Studio 2013 Express 我从名为 BankNoteBook 的现有 SQL Server Express 数据

随机推荐