断言可以用在常量表达式中吗?

2024-03-07

The assert- 宏来自<cassert>提供了确保满足条件的简洁方法。如果参数的计算结果为true,不会产生任何进一步的影响。但是,在这种情况下,它的调用也可以在常量表达式内部使用吗?


这件事已被处理LWG 2234 http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#2234,在放宽限制后又重新受到关注constexpr功能已被引入。

拟议决议:

该措辞是相对于N3936而言的。

  1. 在 17.3 中的现有列表中引入以下新定义 [定义]:

    常量子表达式[defns.const.subexpr]

    其计算结果为 a 的子表达式的表达式条件表达式CE(5.16 [expr.cond]) 不会阻止CE不再是核心常量表达式 (5.20 [expr.const])。

  2. 在 19.3 [断言] p1 之后插入一个新段落,如下所示:

    -?- 一种表达assert(E)是常量子表达式 ( [defns.const.subexpr]),如果

    • NDEBUG在assert(E)出现的地方定义,或者

    • E根据上下文转换为bool(4 [conv]) 是一个常量子表达式,其计算结果为true.

常量子表达式

该决议提出了一个概念常量子表达式- 本质上是一个表达式,它本身(不一定)不是常量表达式,但可以在常量表达式内部使用。例如考虑

constexpr void f() {
    int i = 0;
    ++i;
}

++i不是常量表达式,因为它修改生命周期在该表达式之外开始的对象(第 5.20/(2.15) 节)。然而,表达f()完全是一个常量表达式,因为前一点不适用 -i的生命周期开始于f. Hence ++i是一个常量子表达式,如++i并不能阻止f()从一个常数表达式。

And assert?

该决议的第二部分保证assert(E)是一个常量子表达式,如果NDEBUG被定义或者参数本身是一个常量子表达式并且计算结果为true。这意味着调用assert也可以是 bog 标准常量表达式。

以下是格式良好的:

constexpr int check(bool b) {
    assert(b);
    return 7;
}
constexpr int k = check(true);

b是一个常量子表达式,计算结果为true在通话中check(true), hence assert(b)是一个常量子表达式,因此不会阻止check(true)从成为一体。

当然,同样的陷阱static_assert在模板中是可能的。鉴于NDEBUG未定义,此定义格式不正确,§7.1.5/5 不需要诊断:

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

断言可以用在常量表达式中吗? 的相关文章

  • 通过 Active Directory 搜索进行有效分页

    在 NET 中使用 Active Directory 搜索进行分页的有效方法是什么 在 AD 中进行搜索的方法有很多 但到目前为止我找不到如何有效地进行搜索 我希望能够表明Skip and Take参数并能够检索结果中与我的搜索条件匹配的记
  • do { ... } while (0) — 它有什么用? [复制]

    这个问题在这里已经有答案了 我已经看到这个表情十多年了 我一直在努力思考它有什么好处 因为我主要在 defines 中看到它 所以我认为它对于内部作用域变量声明和使用中断 而不是 gotos 很有用 对其他方面有好处吗 你用它吗 这是 C
  • 从变量使用 OLE DB 源命令的 EzAPI 等效项是什么?

    tl dr 使用 来自变量的 SQL 命令 数据访问模式的 OLE DB 源并分配变量的 EzAPI 代码是什么 Preamble 每月一次 我们需要使用生产数据的子集刷新我们的公共测试站点 我们已确定 根据我们的需求 SSIS 解决方案最
  • 创建动态对象

    如何动态创建对象 string columnNames EmpName EmpID PhoneNo List
  • 未定义的参考错误 - rand

    我正在创建一个命令行 C 测试应用程序 可执行 以便在我的 root Android 设备上运行 该可执行文件使用多个预构建的 C 库 其中之一使用 rand 在链接状态期间我收到错误 rand 的未定义引用 为了检查路径是否设置正确 我尝
  • 如何直观理解C++优先级队列容器比较器中的大于/小于运算符

    我总是对为优先级队列容器定义比较器感到困惑 并且不知道如何理解它 例如 我有一个vector of pair
  • 如何在 VS 2013 的立即窗口中执行 LINQ 和/或 foreach?

    在调试过程中探测当前状态时 立即窗口是非常有用的工具 我了解到 通过使用问号 人们可以在那里做更多的事情 如图所示在这篇文章中 https stackoverflow com questions 32934635 execute metho
  • 如何使用 VB.NET 或 C#.NET 代码从 yahoo 邮件 ID 发送邮件

    我想从我的 yahoomail Id 发送邮件 如何使用 VB NET 或 C NET 代码从 yahoo mail Id 发送邮件 需要善意的帮助 提前谢谢 西瓦库马尔 以下是一些制作基本 html 电子邮件消息的示例 http help
  • 为什么 ATOMIC_FLAG_INIT 为假?

    In C 11有std atomic flag这对于线程循环很有用 static std atomic flag s done ATOMIC FLAG INIT void ThreadMain while s done test and s
  • Err_Response_Headers_Multiple_Content_Disposition

    我需要导出 2csv单击一个按钮即可打开文件 下面是我生成2的代码csv files using System Data using System Data SqlClient using System Text using System
  • 数据绑定问题,请解释

    public partial class Form1 Form MyClass myClass new MyClass one two public Form1 InitializeComponent textBox1 DataBindin
  • ASP.NET MVC - HybridViewResult (ViewResult /PartialViewResult)

    是否可以构建一个依赖于 Ajax 请求或 Http 请求返回的混合 ViewResultPartialViewResult or ViewResult IsAjaxRequest gt 返回 PartialViewResult IsAjax
  • 大表的最佳主键格式

    我正在开发一个 ASP NET 应用程序 它有一些可能很大的数据表 我想知道定义主键的最佳方法是什么 我知道以前已经有人问过这个问题 但由于这是针对特定情况的 所以我认为这个问题是有效的 我在 SQL Server 2008 数据库上使用实
  • 如何将 Activator.CreateInstance 与字符串一起使用?

    在我的反射代码中 我的通用代码部分遇到了问题 特别是当我使用字符串时 var oVal object Test var oType oVal GetType var sz Activator CreateInstance oType oVa
  • 从多页 tiff 中提取帧 - C#

    有一个多页 tiff 我想从此 Tiff 文件中提取第 n 页 帧 n 并保存它 如果我的多页 tiff 有 3 帧 在我提取一页 帧后 我想留下 1 张图像有 2 页 帧 并且 1 张图像只有 1 页 帧 下面是一些代码 用于将多帧 ti
  • 什么时候适合在 C++ 中使用 static(在未命名的命名空间上)?

    我一整天都在阅读有关未命名命名空间的文章 大多数文章都解释了何时应该在 static 关键字上使用未命名命名空间 但我仍然有一个大问题什么时候适合使用静态 毕竟它还没有完全弃用 那么带有静态函数的头文件我现在应该将它们放入未命名的命名空间中
  • 如何防止用户生成的 Sql 查询上的 Sql 注入

    我有一个项目 私有的 ASP net 网站 受 https 密码保护 其中要求之一是用户能够输入直接查询数据库的 Sql 查询 我需要能够允许这些查询 同时防止它们对数据库本身造成损坏 以及访问或更新它们不应该访问 更新的数据 我制定了以下
  • Fluent Validation 将 CustomAsync 更改为 MustAsync

    有人可以帮我解决这个问题吗 我正在努力改变CustomAsync 到 MustAsync 但我无法让事情发挥作用 下面是我的自定义方法 RuleFor o gt o MustAsync o gt return CheckIdNumberAl
  • Microsoft Graph API 调用无限期挂起

    我正在尝试使用 Microsoft Graph 查询 Azure Active Directory 用户信息 我可以很好地进行身份验证 但是当我尝试查询用户信息时client Users我的应用程序无限期挂起 没有超时 没有错误 只是挂起
  • qt 如何知道按钮被点击?

    我正在尝试编写一个程序 用声音进行一些操作 我的问题是我有 3 个播放按钮和 3 个标签 我希望无论我单击 播放 按钮 都应该播放按钮附近标签中名称的声音 我有一个没有任何参数的播放插槽 那么 如何分别连接到每个播放按钮和每个标签呢 实际上

随机推荐